等到在Selenium WebDriver中点击按钮以点击下一个按钮?

时间:2017-11-12 17:45:57

标签: python selenium xpath selenium-webdriver

我在我的程序中点击浏览器中的按钮并在该页面内,应该出现另一个按钮。出现该按钮后,我的程序将立即运行下一个操作以单击下一个按钮。我目前收到此错误:

  

ElementNotVisibleException:消息:元素不可见

因此,我假设我在该按钮出现之前调用动作点击下一个按钮。我的问题是如何让我的程序等到我可以点击按钮,点击按钮?

driver.find_element_by_xpath('//*[@id="add-remove-buttons"]/input').click()
driver.find_element_by_xpath('//*[@id="cart"]/a[2]').click()

这是代码在程序底部的样子。我需要等到第二个动作可以完成第二个动作。谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

您正在寻找Selenium Waits。基本上,您想要单击按钮并等待另一个按钮出现,然后单击该按钮。这里回答了类似的问题:Selenium waitForElement

你可以这样做(未经测试的代码):

import contextlib
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as ui

with contextlib.closing(webdriver.Firefox()) as driver:
    driver.get('http://example.com')
    wait = ui.WebDriverWait(driver,10)

    driver.find_element_by_xpath('//*[@id="add-remove-buttons"]/input').click()

    # Wait until the element appears
    wait.until(lambda driver: driver.find_element_by_xpath('//*[@id="cart"]/a[2]'))
    driver.find_element_by_xpath('//*[@id="cart"]/a[2]').click()

你可能需要玩这个。我发现每当我使用wait时,需要一段时间才能正确使用driver.save_screenshot。您可以使用<html> <script> function addItem() { setInterval(() => { var ul = document.getElementById('mylist'); var newItem = document.createElement('li') newItem.innerHTML = 'hello0.0' ul.insertBefore(newItem, ul.childNodes[0]); }, 1000); } </script> <body> <button onclick='addItem()'> </button> <ul id='mylist'> <li id="insertPoint"> hello1 </li> <li> hello2 </li> </ul> </body> </html> 进行调试。

答案 1 :(得分:0)

As per your Question, we are trying to invoke click() method on both the buttons so we will induce ExplicitWait i.e. WebDriverWait with expected_conditions as element_to_be_clickable as follows :

firstButton = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(By.XPATH,"//*[@id='add-remove-buttons']/input"))
firstButton.click()
secondButton = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(By.XPATH,"//*[@id='cart']/a[2]"))
secondButton.click()