鱼C论坛

 找回密码
 立即注册
查看: 41766|回复: 4

[已解决]PYTEST+playwright执行ui自动化用例时超时

[复制链接]
发表于 2023-7-19 18:08:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
调试时是正常能通过用例的,pytest批量执行时就不行

如下为报错
E       playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.
E       =========================== logs ===========================
E       waiting for selector "//div[@class="org-item-sklenton"]/div/li//span[contains(text(), "test01")]"
E         selector resolved to hidden <span>test01</span>
E       attempting click action
E         waiting for element to be visible, enabled and stable
E           element is not visible - waiting...
E       ============================================================

D:\python\lib\site-packages\playwright\_impl\_connection.py:78: TimeoutError
--------------------------------------------------------------------------------------------------------- Captured log setup ---------------------------------------------------------------------------------------------------------- 
INFO     Test:__init__.py:90 ------------------------------------------------------
INFO     Test:__init__.py:91 Func test_stuff_002 in file: D:\Project\defineuitest\test_case\test_demo.py
========================================================================================================== warnings summary =========================================================================================================== 
conftest.py:25
  D:\Project\defineuitest\conftest.py:25: PytestDeprecationWarning: The hookimpl pytest_runtest_makereport uses old-style configuration options (marks or attributes).
  Please use the pytest.hookimpl(hookwrapper=True) decorator instead
   to configure the hooks.
   See docs.pytest.org/en/latest/deprecations.html#configuring-hook-specs-impls-using-markers
    @pytest.mark.hookwrapper

-- Docs: docs.pytest.org/en/stable/how-to/capture-warnings.html
---------------------------------------------------------------------- generated xml file: D:\Project\defineuitest\test_report\2023_07_19_18_05_48\junit-xml.xml ---------------------------------------------------------------------- 
======================================================================================================= short test summary info ======================================================================================================= 
FAILED test_case/test_demo.py::TestStuff::test_stuff_002 - playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.
最佳答案
2023-7-19 18:09:13
您的问题是在使用pytest和playwright进行UI自动化测试时,出现了超时错误。您提供的错误日志显示,超时发生在尝试等待一个特定元素变为可见。这个特定元素由以下选择器定义: "//div[@class="org-item-sklenton"]/div/li//span[contains(text(), "test01")]" 。

该错误可能由多种原因引起。以下是一些可能的解决方案:

1. **增加超时时间**:默认的超时时间可能对某些操作来说不够。您可以尝试增加等待元素出现的超时时间,看看问题是否可以解决。例如,如果您是使用  page.waitForSelector()  方法来等待元素出现,您可以尝试如下的方法增加超时时间:

   page.waitForSelector(selector, timeout=60000)  # 设置60秒的超时时间   
2. **检查选择器是否正确**:如果选择器不正确或者元素实际上从未出现在页面上,那么等待操作会一直持续到超时。请仔细检查您的选择器,并确保它能够在页面上定位到正确的元素。

3. **检查页面加载情况**:如果页面加载非常慢,或者由于网络延迟、服务器响应延迟等问题,导致元素没有在预期的时间内出现,那么等待元素出现的操作就可能会超时。您可以尝试手动检查页面加载的情况,看看是否存在这样的问题。

4. **元素实际上是隐藏的**:日志中提到  "selector resolved to hidden <span>test01</span>" 。如果您试图等待的元素实际上是被隐藏的,那么等待它变为可见的操作会永远等待下去,直到超时。您可能需要检查元素是否会在某些条件下被显示,或者改用其他的方法定位和操作这个元素。

希望这些信息能对您有所帮助。如有其他问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-19 18:08:53 | 显示全部楼层
根据提供的错误信息,报错指出了超时问题 playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.,说明在执行 UI 自动化用例时等待某个元素可见、启用并稳定的操作超过了设置的超时时间。

在您的调试过程中,用例能够正常通过,但是在使用 Pytest 批量执行时出现问题。这可能是因为在批量执行时,测试用例之间的执行速度较快,而某些元素可能需要更长的时间才能正确加载和可见。因此,您可以尝试增加等待元素可见的超时时间来解决此问题。

有几种方法可以调整等待超时时间。以下是其中一种方法:

1. 在您的测试用例中找到需要等待的操作,例如等待元素可见的操作。
2. 在等待操作之前添加一个延迟,以便等待页面完全加载。
3. 使用 Playwright 提供的 waitFor 方法,并将超时时间设置为更长的值。例如,使用 page.waitFor(selector, timeout=60000) 来等待一个元素出现,将超时时间设置为 60 秒。

这样做可以给页面更多的时间来加载和渲染元素,从而避免超时错误。

另外,还可以检查您的测试环境和网络连接是否稳定,以确保页面能够正常加载和显示元素。

希望这些建议对解决问题有帮助。如果您还有其他疑问,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 18:09:13 | 显示全部楼层    本楼为最佳答案   
您的问题是在使用pytest和playwright进行UI自动化测试时,出现了超时错误。您提供的错误日志显示,超时发生在尝试等待一个特定元素变为可见。这个特定元素由以下选择器定义: "//div[@class="org-item-sklenton"]/div/li//span[contains(text(), "test01")]" 。

该错误可能由多种原因引起。以下是一些可能的解决方案:

1. **增加超时时间**:默认的超时时间可能对某些操作来说不够。您可以尝试增加等待元素出现的超时时间,看看问题是否可以解决。例如,如果您是使用  page.waitForSelector()  方法来等待元素出现,您可以尝试如下的方法增加超时时间:

   page.waitForSelector(selector, timeout=60000)  # 设置60秒的超时时间   
2. **检查选择器是否正确**:如果选择器不正确或者元素实际上从未出现在页面上,那么等待操作会一直持续到超时。请仔细检查您的选择器,并确保它能够在页面上定位到正确的元素。

3. **检查页面加载情况**:如果页面加载非常慢,或者由于网络延迟、服务器响应延迟等问题,导致元素没有在预期的时间内出现,那么等待元素出现的操作就可能会超时。您可以尝试手动检查页面加载的情况,看看是否存在这样的问题。

4. **元素实际上是隐藏的**:日志中提到  "selector resolved to hidden <span>test01</span>" 。如果您试图等待的元素实际上是被隐藏的,那么等待它变为可见的操作会永远等待下去,直到超时。您可能需要检查元素是否会在某些条件下被显示,或者改用其他的方法定位和操作这个元素。

希望这些信息能对您有所帮助。如有其他问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-19 18:09:27 | 显示全部楼层
补发一下代码
    @allure.story("test003-新增应用")
    def test_stuff_002(self, page, base_url):
        """
        名称:新增应用
        步骤:
        1、登录后平台后切换后台
        2、输入应用编码
        3、输入应用名称
        4、点击新增
        检查点:
        * 检查新增是否成功
        """
        page.goto(base_url)
        page.get_by_role("tab", name="平台管理").click()
        page.get_by_placeholder("账号").click()
        page.get_by_placeholder("账号").fill(str(Variable.userAccount))
        page.get_by_placeholder("密码").click()
        page.get_by_placeholder("密码").fill(str(Variable.userPassword))
        page.get_by_role("button", name="登录").click()
        page.get_by_role("button", name="宇飞").click()
        with page.expect_popup() as page_info:
            page.get_by_text("后台管理").click()
        page = page_info.value
        page.get_by_placeholder("账号").click()
        page.get_by_placeholder("账号").fill(str(Variable.userAccount))
        page.get_by_placeholder("密码").click()
        page.get_by_placeholder("密码").fill(str(Variable.userPassword))
        page.get_by_role("button", name="登录").click()
        page.locator("xpath = /html/body/div[1]/div[1]/div/div[1]/div[2]/div[1]/div[1]/div").click()
        page.locator(f'//div[@class="org-item-sklenton"]/div/li//span[contains(text(), "test01")]').click()
        page.locator(
            '//div[@class="admin__menu"]/ul/li//span[@class="base-menu-item__name"][contains(text() , "应用管理")]').click()
        page.locator(
            '//button[@class="el-button button-item apaas-font-body el-button--primary"]//span[contains(text(),"创建应用")]').click()
        page.get_by_placeholder("请输入应用编码").click()
        page.get_by_placeholder("请输入应用编码").fill(Variable.applicationId)
        page.get_by_placeholder("请输入应用名称").click()
        page.get_by_placeholder("请输入应用名称").fill(Variable.applicationName)
        page.get_by_role("button", name="确定").click()
        sleep(2)
        assert page.title() == "应用详情%"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-19 18:17:01 | 显示全部楼层
isdkz 发表于 2023-7-19 18:09
您的问题是在使用pytest和playwright进行UI自动化测试时,出现了超时错误。您提供的错误日志显示,超时发生 ...

添加了page.wait_for_timeout(1500)解决问题了,还有个问题想请问下,最后的assert如何判断class中包含关键字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 08:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表