#python #python-3.x #selenium
Вопрос:
Я работаю над сценарием для selenium, чтобы открыть веб-страницу и нажать ряд кнопок. Первая кнопка-это кнопка расширения, показанная на рисунке ниже
HTML-код от проверки кнопки приведен ниже, но сама кнопка «class=»dojoxExpandoIcon dojoxExpandoIconLeft qa-кнопка-toc»
<div class="dojoExpandoPaneInner">
<div data-dojo-attach-point="titleWrapper" class="dojoxExpandoTitle">
<div class="dojoxExpandoContainer">
<div class="dojoxExpandoIcon dojoxExpandoIconLeft qa-button-toc" data-dojo-attach-point="iconNode" data-dojo-attach-event="ondijitclick:_onIconNodeClick" tabindex="0" aria-controls="slideout"><span class="a11yNode">X</span></div>
</div>
Xpath также выглядит следующим образом:
/html[@class='dj_webkit dj_chrome dj_contentbox has-webkit has-no-quirks svg']/body[@class='claro original']/div[@id='border']/div[@id='slideout']/div[@class='dojoExpandoPaneInner']/div[@class='dojoxExpandoTitle']/div[@class='dojoxExpandoContainer']/div[@class='dojoxExpandoIcon dojoxExpandoIconLeft qa-button-toc']
Чтобы найти эту кнопку, я попробовал следующий код по одному за раз.
driver.find_element_by_css_selector("div[class^='dojoxExpandoIcon']") # find expander by class name
# driver.find_element_by_css_selector("div[class^='dojoxExpandoIcon dojoxExpandoIconLeft qa-button-toc']") # find expander by class name
# driver.find_element_by_css_selector("div.dojoxExpandoContainer")
Однако ни один из них вообще не работал и приводил к таким ошибкам, как
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"div.dojoxExpandoIcon.dojoxExpandoIconLeft.qa-button-toc"}
Есть ли что-то, что я здесь делаю не так?
Комментарии:
1. есть ли какой-нибудь iframe ? пожалуйста, проверьте
2. @cruisepandey нет iframe. Я добавил полный xpath раскрывающегося списка на странице, если это поможет.
Ответ №1:
Попробуйте подождать, пока локатор не станет доступным для кликабельности:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 15)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".dojoxExpandoIcon.dojoxExpandoIconLeft.qa-button-toc")))
button = driver.find_element_by_css_selector(".dojoxExpandoIcon.dojoxExpandoIconLeft.qa-button-toc").click()
Если количество классов не является стабильным, удалите те, которые меняются, и оставьте только стабильные, например:
.dojoxExpandoIconLeft.qa-button-toc
Здесь я только что удалил один из классов.
Подробнее об этом читайте здесь https://selenium-python.readthedocs.io/waits.html.
Комментарии:
1. Отличается ли этот подход от использования time.sleep? Обычно я даю веб-странице не менее 30 секунд на открытие с помощью time.sleep(30), который в основном приостанавливается перед выполнением следующего шага в коде.
2. Это совсем другое. Он ждет, пока элемент не будет найден, и сразу после того, как он найден, на него нажимают. Таким образом, это в основном экономит ваше время, экономически эффективно. Обычно загрузка страницы занимает 30 секунд, затем измените время ожидания от 15 до 30 секунд.
3. Нет. Это не сработало. Я получил тайм-аут исключения трассировки стека из-за того, что он не смог найти элемент. Я в тупике. HTML — код там есть…. Есть ли какой-нибудь способ сделать это с помощью x_path вместо CSS? Я ввел полный xpath в свой код.
4. Хорошо, поставьте полный html-код лучше.