#python #selenium #selenium-webdriver #selenium-chromedriver
Вопрос:
Поэтому я пытаюсь перейти на страницу, на которой есть раскрывающаяся кнопка. Мне удается, по крайней мере, найти раскрывающуюся кнопку, используя следующий код:
driver.find_element_by_xpath("//*[contains(text(), 'Real')]").click()
Однако это приводит к появлению сообщения об ошибке:
селен.общие.исключения.Исключение ElementNotInteractableException: Сообщение: элемент не поддается взаимодействию
Вот полная исходная страница:
<et-select _ngcontent-mhs-c11="" automation-id="menu-layout-link-mode" class="i-menu-link-mode-demo dropdown-menu no-arrow ng-tns-c13-0 ng-star-inserted" _nghost-mhs-c13="">
<div _ngcontent-mhs-c13="" class="ng-tns-c13-0">
<et-select-header _ngcontent-mhs-c11="" _nghost-mhs-c14="">
<div _ngcontent-mhs-c14="" class="header-text"> Real </div>
<i _ngcontent-mhs-c14="" class="arrow-down"></i>
</et-select-header>
<!---->
</div>
<!---->
<!---->
<!---->
</et-select>
Я не могу заставить это на самом деле запустить следующий бит, который выглядит так, как будто он сгенерирован автоматически, и мне придется выбрать следующий (я еще не написал этого, потому что я его не вижу:
<div _ngcontent-mhs-c13="" class="relative-body ng-tns-c13-0 ng-trigger ng-trigger-openClose ng-star-inserted"><!---->
<div _ngcontent-mhs-c13="" class="dlg elad ng-tns-c13-0 ng-star-inserted" style="">
<div _ngcontent-mhs-c13="" class="dlg-head">
<span _ngcontent-mhs-c13="" class="icon-close"></span>
</div>
<!---->
<div _ngcontent-mhs-c13="" class="dlg-body"><et-select-body _ngcontent-mhs-c11="" _nghost-mhs-c15=""><et-select-body-option _ngcontent-mhs-c11="" class="active" _nghost-mhs-c16=""><span _ngcontent-mhs-c11="">Real Portfolio</span><!----></et-select-body-option><et-select-body-option _ngcontent-mhs-c11="" class="active" _nghost-mhs-c16=""><span _ngcontent-mhs-c11="">Virtual Portfolio</span><!----><span _ngcontent-mhs-c11="" class="icon-check ng-star-inserted"></span></et-select-body-option></et-select-body>
</div>
</div>
</div>
В качестве обходного пути я попытался записать его через среду разработки selenium и использовать там xpath, но я ничего не добился.
Ответ №1:
Кажется, что элемент не виден до того, как вы вступили во взаимодействие. Используйте WebDriverWait()
и ждите element_to_be_clickable()
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//*[contains(text(), 'Real')]"))).click()
Вам необходимо импортировать следующие библиотеки.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
Комментарии:
1. Я завернул это в инструкцию try except, и в ней была ошибка: сбой ( Исключение TimeoutException’>, исключение TimeoutException(«, Нет, нет), ><объект отслеживания в 0x000001E7E117E380>)
2. @vwdewaal : Доступна ли веб-страница?
3. Да, он сидит там и ждет 20 секунд. Он немедленно визуализируется, а затем ждет.
Ответ №2:
Попробуйте выполнить click с помощью javascript и функции драйвера execute_script, например:
element = driver.find_element_by_xpath("//div[@class='header-text' and contains(text(), 'Real')]")
driver.execute_script("arguments[0].click();", element);
Комментарии:
1. Я реализовал это следующим образом: попробуйте: элемент = driver.find_element_by_xpath(«//*[содержит(текст(), «Реальный»)]») драйвер.execute_script(«аргументы[0].нажмите();», элемент), за исключением исключения: печать(f’failure-это {sys.exc_info ()}’), он просто молча завершается без каких-либо действий? Я на Windows 10, не уверен, что мне не хватает какой-то установки
2. @vwdewaal итак, он находит элемент
3. ах, хорошо, я не вижу, как происходит щелчок, хотя я пойду дальше и попробую реализовать следующий бит и посмотрю, сможет ли он найти это
Ответ №3:
Попробуйте другой локатор. Выбор по тексту не всегда надежен. Если есть несколько локаторов с одним и тем же адресом, дайте мне знать:
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((SelectBy.XPATH, "//div[contains(@class,'header-text')]")))
driver.driver.find_element_by_xpath("//div[contains(@class,'header-text')]").click()
Или с помощью CSS-локаторов,
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((SelectBy.CSS_SELECTOR, ".header-text")))
driver.driver.find_element_by_css_selector(".header-text").click()