鱼C论坛

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

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

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

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

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

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

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

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

  20. -- Docs: docs.pytest.org/en/stable/how-to/capture-warnings.html
  21. ---------------------------------------------------------------------- generated xml file: D:\Project\defineuitest\test_report\2023_07_19_18_05_48\junit-xml.xml ----------------------------------------------------------------------
  22. ======================================================================================================= short test summary info =======================================================================================================
  23. 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()  方法来等待元素出现,您可以尝试如下的方法增加超时时间:

  
  1.    page.waitForSelector(selector, timeout=60000)  # 设置60秒的超时时间
  2.    
复制代码

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

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

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

希望这些信息能对您有所帮助。如有其他问题,欢迎继续提问。
小甲鱼最新课程 -> https://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 秒。

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

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

希望这些建议对解决问题有帮助。如果您还有其他疑问,请随时提问。
小甲鱼最新课程 -> https://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()  方法来等待元素出现,您可以尝试如下的方法增加超时时间:

  
  1.    page.waitForSelector(selector, timeout=60000)  # 设置60秒的超时时间
  2.    
复制代码

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

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

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

希望这些信息能对您有所帮助。如有其他问题,欢迎继续提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-19 18:09:27 | 显示全部楼层
补发一下代码
  1.     @allure.story("test003-新增应用")
  2.     def test_stuff_002(self, page, base_url):
  3.         """
  4.         名称:新增应用
  5.         步骤:
  6.         1、登录后平台后切换后台
  7.         2、输入应用编码
  8.         3、输入应用名称
  9.         4、点击新增
  10.         检查点:
  11.         * 检查新增是否成功
  12.         """
  13.         page.goto(base_url)
  14.         page.get_by_role("tab", name="平台管理").click()
  15.         page.get_by_placeholder("账号").click()
  16.         page.get_by_placeholder("账号").fill(str(Variable.userAccount))
  17.         page.get_by_placeholder("密码").click()
  18.         page.get_by_placeholder("密码").fill(str(Variable.userPassword))
  19.         page.get_by_role("button", name="登录").click()
  20.         page.get_by_role("button", name="宇飞").click()
  21.         with page.expect_popup() as page_info:
  22.             page.get_by_text("后台管理").click()
  23.         page = page_info.value
  24.         page.get_by_placeholder("账号").click()
  25.         page.get_by_placeholder("账号").fill(str(Variable.userAccount))
  26.         page.get_by_placeholder("密码").click()
  27.         page.get_by_placeholder("密码").fill(str(Variable.userPassword))
  28.         page.get_by_role("button", name="登录").click()
  29.         page.locator("xpath = /html/body/div[1]/div[1]/div/div[1]/div[2]/div[1]/div[1]/div").click()
  30.         page.locator(f'//div[@class="org-item-sklenton"]/div/li//span[contains(text(), "test01")]').click()
  31.         page.locator(
  32.             '//div[@class="admin__menu"]/ul/li//span[@class="base-menu-item__name"][contains(text() , "应用管理")]').click()
  33.         page.locator(
  34.             '//button[@class="el-button button-item apaas-font-body el-button--primary"]//span[contains(text(),"创建应用")]').click()
  35.         page.get_by_placeholder("请输入应用编码").click()
  36.         page.get_by_placeholder("请输入应用编码").fill(Variable.applicationId)
  37.         page.get_by_placeholder("请输入应用名称").click()
  38.         page.get_by_placeholder("请输入应用名称").fill(Variable.applicationName)
  39.         page.get_by_role("button", name="确定").click()
  40.         sleep(2)
  41.         assert page.title() == "应用详情%"
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

添加了page.wait_for_timeout(1500)解决问题了,还有个问题想请问下,最后的assert如何判断class中包含关键字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 12:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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