Python Selenium Element is not clickable at point

Возникла сложность, у меня есть список елементов на странице которые нужно проверив кликнув на них переходя на новую страницу а потом вернуться, получилось так что срабатывают первые 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()

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

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


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

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

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

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

Похоже вот куда клик попадёт:
https://i.imgur.com/JswrvHI.png

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

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

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

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

driver.execute_script("arguments[0].click();", element)
1 лайк

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

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

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

Можете помечать тему как решенную. Если у вас 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))

3 лайка

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

1 лайк