Щелчок по селену приводит к появлению целевой страницы с ошибкой

#javascript #python #php #html #selenium

#javascript #python #php #HTML #селен

Вопрос:

Данный щелчок по элементу xpath:

 self.browser.find_element_by_xpath(xpath).click()
  

Или с помощью js:

 self.browser.execute_script("arguments[0].click();", self.browser.find_element_by_xpath(xpath))
  

На странице, которую я тестирую, если щелчок выполняется с любым из вариантов, отображается целевая страница с ошибкой, но если я установлю тайм-аут в 20 секунд и вручную нажму на боттон, страница отобразит все без проблем, страница с ошибкой не появится.

Кто-нибудь сталкивался с подобной проблемой когда-либо?

Комментарии:

1. Что, если вы добавите режим ожидания перед щелчком, как, time.sleep(20)

2. Сделал это, просто чтобы я мог щелкнуть по нему сам, и оставил его для запуска с ним также, кажется, что chrome делает какие-то странные вещи, даже если я очистил кеш и все

Ответ №1:

Вы можете рассмотреть возможность использования следующей функции:

 from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException


def test_for_clickability(driver, by_type, by_value, wait_time=0):
    try:
        return WebDriverWait(driver, wait_time).until(EC.element_to_be_clickable((by_type, by_value))), True
    except TimeoutException:
        try:
            return WebDriverWait(driver, 0).until(EC.visibility_of((by_type, by_value))), FALSE
        except Exception:
            return (None, False)
  

Например:

 element, clickable = test_for_clickability(driver, By.XPATH, xpath, wait_time=20)
  

Вышеописанное будет ждать до 20 секунд, чтобы попытаться найти элемент по его XPATH. Если он не сможет его найти, element значение будет возвращено как None . Если нет None , clickable то будет True , если элемент ответит на element.click() вызов метода. В противном случае вам следует попробовать использовать driver.execute_script("arguments[0].click();", element) вызов.

Ответ №2:

Я настоятельно предполагаю, что ваш элемент еще не доступен для просмотра, потому что он не полностью загружен в тот момент, когда программа пытается щелкнуть по нему. Поэтому проблема не возникает, если вы подождете 20 секунд. Я бы рекомендовал вам взглянуть на это: https://selenium-python.readthedocs.io/waits.html

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

Просто немного кода для иллюстрации:

 driver = webdriver.Chrome()
driver.get("your.web.url")

try:
    element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, "yourXPATH"))
    )
finally:
    driver.quit()