Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Python Selenium Element is not clickable at point

selenium
python
Теги: #<Tag:0x00007fedb878d1f8> #<Tag:0x00007fedb878d090>

(Serge Soloshchenko) #1

Возникла сложность, у меня есть список елементов на странице которые нужно проверив кликнув на них переходя на новую страницу а потом вернуться, получилось так что срабатывают первые 3 елемента а те что ниже (не видны) и пишет каждый раз Element is not clickable at point … Кто может посмотреть и сказать какие есть варианты ? Пробовал с ActionChains(driver).move_to_element(elem).perform() разные вариации но увы

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC, expected_conditions, wait
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
from selenium.webdriver.support.wait import WebDriverWait


class Video003(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.hydroshare.org/"
        self.verificationErrors = []
        self.accept_next_alert = True


    def test_180320_video003(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text("HELP").click()
        support_links = driver.find_elements_by_css_selector(".topic-name>div")
        links_text = []
        for l in support_links:
            links_text.append(l.text)
        for link in links_text:
            elem = driver.find_element_by_xpath("//div[contains(text(),\"{}\")]".format(link))
            ActionChains(driver).move_to_element(elem).perform()
            elem.click()
            WebDriverWait(driver, 4).until(
                expected_conditions.text_to_be_present_in_element(
                    (By.CSS_SELECTOR, "#breadcrumb-menu-home>a"),
                    "HydroShare Support"
                )
            )
            driver.back()

(Lev Yarushin) #2

а в ошибке что пишется? что help-topic-thumbnail получит клик?
У меня ваш код отработал, правда в хроме.


(Martin Schrader) #3

попробуй проматывать страницу вниз, чтобы было видно элементы, например так:


self.driver.execute_script
(“function pgdown() { window.scrollBy(0,2); if (window.pageYOffset < 725) {requestAnimationFrame(pgdown);} } pgdown();”)


(Serge Soloshchenko) #4

У меня вот что выдает
selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (371.5, 11.600006103515625). Other element would receive the click:
Но в Firefox запускаю, и по требованиям как раз нужно что бы в нем работало :sweat:


(Serge Soloshchenko) #5

А это после каждого элемента что бы проматывало получается?


(Martin Schrader) #6

я думаю проблема здесь, попробуй изменить локатор


(Lev Yarushin) #7

Похоже вот куда клик попадёт:

Нужно изменить размер окна браузера на больший, чтобы элементы не влазили под меню.


(Serge Soloshchenko) #8

Попробовал и сам запустить на Chrome, с первого раза заработал, даже при учете того что не не выставлял размер окна. Потом добавил maximize_window() ну и так же работало хорошо. Но что делать с Firefox уже не знаю


(Serge Soloshchenko) #9

Но локатор работает для первых трех элементов без проблем


(Maxim Andryushchenkov) #10

Попробуйте найти элемент и кинуть его в такую функу:

driver.execute_script("arguments[0].click();", element)

(Serge Soloshchenko) #11

Заработало!!! В чем магия ? Видно что фактически элементы не видни и нет передвижения к ним по экрану. Но работает на ура !


(Lev Yarushin) #12

Важен порядок в котором проходят клики по элементам. У вас сначала ff кликает на что-то внизу, страница прокручивается вниз, при возврате назад - прокрутка на том же месте, а клик на следующий элемент сделать нельзя, т.к. он под меню.
Вижу несколько вариантов:

  1. Жестко задать порядок элементов (вряд ли хелп меняется так часто что вы его перебором прокликиваете)
  2. Скролл вверх страницы после возврата назад.
  3. Как выше предложили - триггерить событие через JS/

(Maxim Andryushchenkov) #13

Можете помечать тему как решенную. Если у вас Page Objects то киньте в BasePage такую функу и забудьте про дефолтные клики:

    def click_via_script(self, element: WebElement):
        """
        Метод осуществляет клик по элементу через JS скрипт
        :param element: экземпляр класса WebElement
        """
        self.driver.execute_script("arguments[0].click();", element)

PS: Использовать чистый Selenium = начать учить JS))


(Serge Soloshchenko) #14

Благодарю за решение и обьяснение, только начал изучать атоматизацию и скажем так все в новинку пока что :slightly_smiling_face: