Python с селеном: невозможно получить доступ к элементу, используя id, xpath, селектор, даже если он есть - PullRequest
0 голосов
/ 07 июля 2019

Что мне нужно сделать, это нажать кнопку ОК во всплывающем окне.Эта кнопка OK упоминается в меню проверки как: id="btn-confirm-yes".Использовал этот идентификатор для доступа к элементу, пытался скопировать его xpath и доступ через него и пытался получить к нему доступ через класс div.К сожалению, все возвращенные элементы не найдены.Мне трудно понять, почему.

 #This is the python script used to access 
 element = driver.find_element_by_id("btn-confirm-yes")  
 if element.is_displayed():  
   print "Confirm button element is there"
   driver.implicitly_wait(4) # seconds
   element.send_keys(Keys.RETURN)
 else:
   print "Confirm button element not found" 


 /* Hierarchy from Inspect menu */
 <div id="sing-out-confirm" class="reveal-modal small open" style="top: 100px; opacity: 1; visibility: visible; display: block;">
<h2 class="text-uppercase">ALL DEVICE SIGNOUT</h2>
<p>Click OK to confirm All Device Signout.</p>
<form id="sign-out-user-account-form" method="post" action="/portal-owner-web/user-account/sign-out-all-device">
    <div class="button-bar">
        <a class="button small close-reveal-modal mr5" href="#">Cancel</a>

        <a class="button small reveal-modal-button mr5" href="#" id="btn-confirm-yes">OK</a>
    </div>
</form>
</div

Необходим доступ к элементу, который указан в окне проверки как: class="button small reveal-modal-button mr5" href="#" id="btn-confirm-yes"

Смещение в правильном направлении было бы очень полезно!

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Из HTML видно, что элемент находится в Модальном диалоге . Таким образом, для click() на кнопке OK вы должны заставить WebDriverWait для элемента быть активируемым , и вы можете использовать любой из следующих Стратегии локатора :

  • Использование LINK_TEXT:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "OK"))).click()
    
  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.button.small.reveal-modal-button.mr5#btn-confirm-yes"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='button small reveal-modal-button mr5' and @id='btn-confirm-yes'][text()='OK']"))).click()
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 07 июля 2019
  1. Убедитесь, что кнопка, которую вы пытаетесь обнаружить, не принадлежит встроенному фрейму
  2. Возможно, кнопка не сразу доступна в DOM сразу, например, она добавляется после основного содержимого в результате вызова AJAX . Поэтому хорошей практикой является использование Явное ожидание , чтобы позволить Selenium периодически опрашивать DOM на предмет появления элементов.

Ссылочный код:

element = WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located((By.ID, "btn-confirm-yes")))

Вам также необходимо добавить следующие операторы import :

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
...