在while循环中元素不可用后继续测试

时间:2019-11-29 19:37:11

标签: python selenium selenium-webdriver while-loop selenium-chromedriver

我有一个网页,其中有5个相同的类按钮,并且每页上有500个以上的页面带有相同的按钮,并且我做了一个while循环来单击所有页面。 但是最终在按钮不再可用的结尾,我收到退出错误代码。 我该如何打印例如“没有更多按钮可用”并完成测试。

res = 1
while res < 10000:
    buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')
    buttons[0].send_keys('\n')
    buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')
    buttons[1].send_keys('\n')
    buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')
    buttons[2].send_keys('\n')
    buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')
    buttons[3].send_keys('\n')
    buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')
    buttons[4].send_keys('\n')
    driver.refresh()
    res = res + 1

2 个答案:

答案 0 :(得分:2)

尝试使用if..else条件检查length of button elements。如果按钮的长度大于零,则进行迭代并执行一些操作,否则打印No more buttons available并中断。

res = 1
while res < 10000:
    buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')
    if len(buttons)>0:
      for idx in range(len(buttons)):
          buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')
          buttons[idx].send_keys('\n')

      driver.refresh()
      res = res + 1
    else:
        print("No more buttons available")
        break

答案 1 :(得分:1)

我将重构您的循环以提高效率,并为您的按钮列表引入一个索引变量:

from selenium.common.exceptions import NoSuchElementException


res = 1

while res < 10000:

    # find buttons list
    buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')

    # iterate and send keys to buttons[0], buttons[1], etc..
    for i in range(0,4):
        try:
            buttons[i].send_keys('\n')

            # find buttons again, in case buttons element list goes stale
            buttons = driver.find_elements_by_xpath('//*[@class="btn default check check green markAsChecked"]')

        except NoSuchElementException: # case: button does not exist
            break

    driver.refresh()
    res = res + 1

现在,我们没有使用buttons[0].send_keysbuttons[1].send_keys一直到buttons[4]的方式,而是使用从0到4的for循环来完成此操作,执行button[i].send_keys

for循环中,我们重新运行对buttons = driver.find_elements...的调用,以便我们可以刷新列表中的按钮元素。这是为了处理在您遍历按钮时可能出现的StaleElementReferenceException

我们还将button[i].send_keys包装在try / except块中,以捕获NoSuchElementException来处理页面上不存在按钮的情况。一旦不再找到按钮,代码将从break循环中for退出,并继续在while循环中执行。

需要注意的事情-这将处理页面上少于或少于 5个按钮的情况。如果按钮的数量可能会发生变化,我们想使用for button in buttons:而不是for i in range(0,4)。如果是这种情况,请告诉我,以便我可以重构代码。