Не могу найти элемент в селене Python - PullRequest
0 голосов
/ 11 января 2020

Здравствуйте. Я пытаюсь использовать селен, чтобы найти кнопку для нажатия. Ниже приведен фрагмент кода HTML, с которым я работаю.

<input type="button" id="runButton" class="button" value="Run Report" onclick="chooseRun()">

Я пытаюсь нажать на кнопку RunButton с кодом ниже.

elem = driver.find_element_by_id('runButton').click()

Я получаю следующее сообщение об ошибке:

NoSuchElementException: Message: Unable to find element with css selector == [id="runButton"]

Не уверен, что еще попробовать.

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Элемент выглядит как динамический c элемент, поэтому click() на элементе, который вам нужно использовать element_to_be_clickable(), и вы можете использовать любой из следующих Локаторных стратегий :

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.button#runButton[value='Run Report']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='button' and @id='runButton'][@value='Run Report']"))).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 голосов
/ 11 января 2020

Скорее всего, что вам нужно сделать, чтобы найти свой элемент, это использовать ожидания. Вам необходимо выделить время, чтобы элемент был видимым, активным и т.д. c. прежде чем вы сможете взаимодействовать с ним. Вы можете найти информацию об ожиданиях здесь: https://selenium-python.readthedocs.io/waits.html

Взято с вышеуказанного сайта:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

elem = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "runButton"))

Если ожидания не работают, возможно, ваш элемент внутри фрейма. Вам нужно сначала переключиться на этот iframe, а затем найти элемент, чтобы найти его.

Вы найдете iframe так же, как и другой элемент, а затем переключитесь на него следующим образом:

iframe = driver.find_element_by_id("content_Iframe")
driver.switch_to.frame(iframe)

button = driver.find_element_by_id("runButton")
button.click()

Как только вы закончите работу с iframe и его содержимым, вам нужно будет вернуться из него:

driver.switch_to.default_content()
...