#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()