Mefine 发表于 2023-7-19 18:08:33

PYTEST+playwright执行ui自动化用例时超时

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

如下为报错
E       playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.
E       =========================== logs ===========================
E       waiting for selector "//div[@class="org-item-sklenton"]/div/li//span"
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:08:53

根据提供的错误信息,报错指出了超时问题 playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.,说明在执行 UI 自动化用例时等待某个元素可见、启用并稳定的操作超过了设置的超时时间。

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

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

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

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

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

希望这些建议对解决问题有帮助。如果您还有其他疑问,请随时提问。

isdkz 发表于 2023-7-19 18:09:13

您的问题是在使用pytest和playwright进行UI自动化测试时,出现了超时错误。您提供的错误日志显示,超时发生在尝试等待一个特定元素变为可见。这个特定元素由以下选择器定义: "//div[@class="org-item-sklenton"]/div/li//span" 。

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

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

      page.waitForSelector(selector, timeout=60000)# 设置60秒的超时时间
   

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

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

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

希望这些信息能对您有所帮助。如有其他问题,欢迎继续提问。

Mefine 发表于 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/div/div/div/div/div/div/div").click()
      page.locator(f'//div[@class="org-item-sklenton"]/div/li//span').click()
      page.locator(
            '//div[@class="admin__menu"]/ul/li//span[@class="base-menu-item__name"]').click()
      page.locator(
            '//button[@class="el-button button-item apaas-font-body el-button--primary"]//span').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() == "应用详情%"

Mefine 发表于 2023-7-19 18:17:01

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

添加了page.wait_for_timeout(1500)解决问题了,还有个问题想请问下,最后的assert如何判断class中包含关键字
页: [1]
查看完整版本: PYTEST+playwright执行ui自动化用例时超时