Как нажать на эту кнопку с помощью Selenium? - PullRequest
0 голосов
/ 16 января 2019

Вот все части элемента, которые я пытаюсь щелкнуть в соответствии с «Осмотреть»:

<div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix">
    ::before
    <div class="ui-dialog-buttonset">
        <button type="button" class="done ui-button ui-corner-all ui-widget">
        Done</button>
    </div>
    ::after
</div>

Когда я хочу щелкнуть по нему, я предполагаю, что он находится в части ::before, поскольку он отображается и кликабелен. В коде я прокручиваю и жду две секунды, прежде чем нажать, чтобы убедиться, что кнопка видна, и все же я получаю:

selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable

Но я не понимаю, как это не взаимодействует. Когда я наводю на него курсор в инспекторе, все в <button>...</button> подсвечивается, поэтому кнопка, которую я хочу нажать, должна быть там, верно?

Вот несколько вещей, которые я пробовал:

browser.find_element_by_css_selector('button[type=button]').click()

browser.find_elements_by_xpath("//*[contains(text(), 'Done')]").click()

# The above returns a list for some reason?

browser.find_elements_by_css_selector('done.ui-button.ui-corner-all.ui-widget')

Хотелось бы вспомнить все, что я пытался, но, тем не менее, я надеюсь, что кто-то может мне помочь.

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Вы можете использовать ActionChains для перехода к элементу

from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_elements_by_css_selector("div.ui-dialog-buttonpane.ui-widget-content.ui-helper-clearfix")

actions = ActionChains(driver)
actions.move_to_element(element).perform()

или вы можете прокрутить, пока элемент не отобразится, используя scrollIntoView ():

driver.execute_script("arguments[0].scrollIntoView();", element)
0 голосов
/ 17 января 2019

Когда вы используете .find_elements (обратите внимание на множественное число), он вернет список вместо одного элемента, как .find_element (единственное). Вы пробовали

browser.find_element_by_xpath("//button[.='Done']")

Если вы получаете len() на этих .find_elements звонках ... это 1? Мне интересно, есть ли более одной кнопки, которая соответствует используемым вами локаторам, и первая не видна, но вы хотите вторую или третью и т. Д.

0 голосов
/ 16 января 2019

Чтобы щелкнуть по элементу, так как требуемый элемент является динамическим элементом, вы должны заставить WebDriverWait для элемента быть активным , и вы можете использовать либоиз следующих решений:

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

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.ui-dialog-buttonpane.ui-widget-content.ui-helper-clearfix"))).click()
    
  • Использование XPATH:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='ui-dialog-buttonpane ui-widget-content ui-helper-clearfix']"))).click()
    
  • Примечание : необходимо добавить следующие операции импорта:

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

Подробное обсуждение можно найти в selenium.common.exceptions.ElementNotVisibleException: Сообщение: элемент не взаимодействует с помощью Selenium

...