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



我有一个网页,其中有 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

尝试使用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

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

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。一旦不再找到按钮,代码将breakfor循环,并继续在while循环中执行。

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

最新更新