当前位置: 首页 > 知识库问答 >
问题:

python selenium使用try except块和while循环在失败后重试时出现问题[重复]

申屠俊发
2023-03-14

我正在尝试使用selenium webdriver单击页面上的返回按钮。有时,由于加载,它可能会在第一次失败,所以我将代码放在while try except块中,以便在失败后重试:

while True:
    try:
        driver.find_element_by_class_name("back_button")
        driver.click()
    except:
        time.sleep(1)
        print("Unable to go back")
        continue
    break

理想情况下,当try块中的部分成功执行时,代码应该继续前进,但我发现有时它仍然试图单击go back按钮,而此时它已经在上一个页面上。然后它会永远卡在while循环中,因为该页面上没有go back按钮。这可能是什么潜在的原因?

共有1个答案

裴英锐
2023-03-14

如果您的代码第一次由于加载而失败,就像您在问题描述中所说的那样,将其包装在try/except中,并用while(true)循环包围,这不是一个处理此问题的好方法,因为您最终可能会遇到某些情况,使您陷入while(true)循环。

在单击之前,最好只在要加载的元素上调用WebDriverWait。在try/除了中包装东西应该是最后的选择。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# need the above import statements

back_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CLASS_NAME, "back_button")))

back_button.click()

# alternative -- if this code STILL throws ElementNotInteractable, try the below:
# driver.execute_script("arguments[0].click();", back_button)
# ^ this clicks with Javascript, which can work around ElementNotInteractable.

如果您真的希望将其封装在try/except块中,以检查back_button在10秒内未加载的情况,可以使用以下命令:

from selenium.common.exceptions import TimeoutException
# import the exception you need to catch

try:
    back_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CLASS_NAME, "back_button")))

    back_button.click()
except TimeoutException: # WebDriverWait throws TimeoutException if it fails
    print("back_button did not appear on page within 10 seconds.")

如果您的click()确实只是由于加载问题而失败,那么上面的代码应该完全消除了您对try/除了以外的的需要。

另外值得一提的是,除了我在您的问题上留下的注释之外--在没有任何异常的情况下使用except:来捕获是非常危险的做法,因为您真的不知道代码为什么会失败。以后在使用exception:时,您应该查找特定的异常,例如exception:exception:nosuchelementexception:。这将使您免于今后的调试噩梦。

 类似资料:
  • while循环开始之前的语句没有打印,并且从1开始没有打印循环中的值。相反,它从一个随机的大int开始打印。

  • 编辑:该问题与fscanf的while循环没有直接关系,而是在用于包含使用fscanf加载的变量的结构的分配中出现了错误 我正在从文件中读取值,并使用它们在使用fscanf的结构中设置参数。我使用Eclipse作为编辑器,并将其调试和gcc作为编译器(从Eclipse内部)。 我下面介绍的由三部分组成:1)我从文件中读入变量的结构的声明。2)我正在读取的文件,以及3)实际从文件中读取的代码。 在所

  • 我是Java新手。我正在尝试遍历一个文件并将每个字符串写入ArrayList。为此,我有如下代码: 然而,由于某种原因,这段代码陷入了无限循环。即使我将打印语句作为当块的第一行,它也不会执行。 accountData.txt文件是这样排列的: 我已经读了很多遍,经常读到这是个问题,因为人们没有用Scanner.next()来移动指针,但我相信我正在这样做。我不知道哪里出了问题。 感谢您的帮助!

  • 下面的代码循环了两次。第一个while循环要求用户输入(以做出选择)。我把选择默认值设置为“n”,使它变得更简单。 因此,它命中if语句并开始第2个while循环。现在它要求用户进行另一个选择。用户只能输入“a”,因为其他任何东西都会出现错误陷阱。用户输入“a”并得到添加一个数字的提示(变量num=0)。用户输入一个数字。 使用更多信息更新的代码 我已经尝试使用不同的变量进行选择。它不起作用。我想

  • 这段代码是为一个基本的杂货计算器的按钮。当我按下按钮时,一个输入对话框显示您在哪里输入您的商品价格。我遇到的问题是,我不知道如何获得循环,使输入对话框在输入后弹出。 我希望它总是回来,除非用户选择ok与nothing或cancel,在这种情况下,循环应该中断并填充剩余的框。使用当前的代码,我必须每次手动按下按钮来恢复对话框。我一直在玩不同的while条件和if语句,但我似乎无法让它发挥作用。我是一

  • 我目前有两个循环,一个获取时间戳,另一个while循环根据时间戳查找映射信息并以某种方式输出。 我的问题是我目前正在循环浏览一个文本,并希望它在第二个循环的isdo="N"时再次从头开始读取文件,但是,情况似乎并非如此。 迄今为止的代码: