Не можете выбрать кнопку выбора выпадающего списка на веб-странице, которая, я думаю, запускает всплывающее окно?

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