#python #selenium #xpath #css-selectors #webdriverwait
#python #селен #xpath #css-селекторы #webdriverwait
Вопрос:
Продолжайте получать unable to locate element
сообщение об ошибке.
Первый элемент поиска с помощью xpath прошел нормально, но второй вызывает у меня затруднения.
Вот мой код:
import XLUtils
from selenium import webdriver
driver=webdriver.Chrome(executable_path="C:Chrome_DriverChromedriver.exe")
driver.get("https://www.canada.ca/en/revenue-agency/services/e-services/e-services-businesses/payroll-deductions-online-calculator.html")
driver.find_element_by_xpath('/html/body/main/div[1]/div[7]/p/a[1]').click()
driver.find_element_by_xpath('//*[@id="welcome_button_next"]').click()
Комментарии:
1. Вы не хотите использовать XPaths с таким количеством уровней или индексов, потому что это делает их хрупкими (с большей вероятностью поломки). Лучшим первым локатором был бы селектор CSS,
a.btn-primary
. Для второго локатора не находите по XPath, когда у вас есть только идентификатор. Вместо этого используйте.find_element_by_id("welcome_button_next").
2. Кроме того, вам необходимо добавить соответствующий HTML-код к вопросу. Предоставление ссылки приятно, но если HTML изменится в будущем, вопрос не будет полезен и не сможет стоять сам по себе.
Ответ №1:
Вам нужно будет немного подождать Next
, пока появится кнопка.
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(driver, 10)
e = wait.until(
EC.presence_of_element_located((By.XPATH, '//*[@id="welcome_button_next"]'))
)
e.click()
Комментарии:
1. Вы не хотите ждать присутствия здесь, а затем щелкнуть. Присутствие указывает на то, что элемент находится в DOM, но не обязательно виден или доступен для просмотра. Вместо этого вы хотите дождаться интерактивного.
2. Спасибо за ваш комментарий! Действительно ценю это!
Ответ №2:
Чтобы щелкнуть элемент с текстом в качестве следующего, вам нужно вызвать WebDriverWait, чтобы элемент был интерактивным, и вы можете использовать любое из следующих решений:
-
Использование
CSS_SELECTOR
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.btn.btn-primary#welcome_button_next"))).click()
-
Использование
XPATH
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='btn btn-primary' and @id="welcome_button_next"]"))).click()
-
Примечание: необходимо добавить следующий импорт :
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
Комментарии:
1. Вместо того, чтобы «спамить» вопросы с большим количеством ответов, которые практически точно совпадают с существующими ответами, почему бы вам не помочь исправить другие ответы, которые близки к идеальным?
2. Спасибо за ваш комментарий! Действительно ценю это!