【问题标题】:Python Selenium define custom TimeoutExceptionPython Selenium 定义自定义 TimeoutException
【发布时间】:2021-02-28 05:36:51
【问题描述】:

我有一个 pytest 脚本,它有多个类,每个类都有一组测试。目前,每个类中的每个测试都定义了相同的 TimeoutException。例如,

class Test1:
    def test_1:
        try:
            "do something"
        except TimeoutException:
            "handle exception"

    def test_2:
        try:
            "do something"
        except TimeoutException:
            "handle exception"

class Test2:
    def test_3:
        try:
            "do something"
        except TimeoutException:
            "handle exception"

“处理异常”部分是我为每个模块设置相同代码的地方。我想知道是否有更蟒蛇的方式来做到这一点。为我的 TimeoutException 处理程序在每个模块中粘贴相同的行似乎很草率。

感谢任何帮助,如果需要更多信息,请告诉我。

提前致谢!

【问题讨论】:

    标签: python python-3.x selenium pytest timeoutexception


    【解决方案1】:

    也许尝试为您想要处理的功能添加一些显式等待。当每个测试都有单独的逻辑时,显式等待专门用于测试用例。我想您的问题与硒有关,因为我看到您标记了您的问题。您可以在每个测试中为您想要等待的每个元素定义它。

    要实现这种显式等待,您可以使用为 WebDrivers 设计的最流行的工具:WebdriverWait。您可以设置超时持续时间以及需要引发 TimeoutException 时定义的条件。

    以下是 Selenium 官方网站的示例:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()
    driver.get("http://somedomain/url_that_delays_loading")
    try:
        element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
    finally:
        driver.quit()
    

    我根据您的代码稍微修改了这个案例,这是一个自定义 TimeoutException 的示例(以最简单的方式忽略页面对象模型):

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()
    driver.get("http://somedomain/url_that_delays_loading")
    
    class Test1:
        def test_1:
            try:
                element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))
            except TimeoutException:
                "handle exception"
    

    另一个非常棒的等待是隐式等待,它为 Selenium 完成的所有操作设置整体超时,如下所示:

    driver.implicitly_wait(10)
    

    这意味着,webdriver 将等待一个 Webelement 十秒钟,然后将引发 TimeoutException。但是,这种等待应该被视为全局的、与大小写无关的等待。

    我希望这个答案会有所帮助。

    这里有一个文档如何做到这一点: https://selenium-python.readthedocs.io/waits.html

    【讨论】:

    • 我这边的另一件事:如果您的所有测试用例都具有相同的超时处理程序,请考虑隐式等待。问候!
    • 我认为我的问题有点误导。我希望实现的是一种可以在每次发生 TimeoutException 时调用的函数。鉴于我将相同的代码粘贴到每个 TimeoutException 中,我想清理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多