Robot Framework+Selenium:如何避免“陈旧元素”错误(片状测试)?

Flo*_*lla 5 selenium robotframework

我正在使用 Robot Framework 和 Selenium 来测试具有语言选择器的网站。我需要能够选择一种语言,然后验证页面实际上已更改为该语言。

由于在选择一种新语言lang后,<html>标签属性中的值发生了变化,我决定使用它来验证语言是否已成功更改。但是我得到了不稳定的结果,因为我的测试有时通过有时不通过。

这是我使用的关键字的定义:

CHANGE LANGUAGE  
  [Arguments]                        ${lang}
  Select From List By Value          ${LANGUAGE SWITCH}  ?hl=${lang}
  Wait Until Page Contains Element   css=html
  ${doc lang}                        Get Element Attribute  css=html@lang
  Should Be True                     '${doc lang}'=='${lang}'   timeout=15s
Run Code Online (Sandbox Code Playgroud)

由于我必须多次执行此关键字(每种可用语言执行一次),因此我经常收到可怕的“陈旧元素”错误:| FAIL | stale element reference: element is not attached to the page document.

我通读了这篇文章和这里的其他一些问题,并了解如果在获取元素引用后更新元素引用,可能会发生这种情况。但是,我不确定应该如何修改关键字以避免出现此错误。

Flo*_*lla 5

使用每个人都非常友好地提供的信息,我可能已经找到了一个潜在的修复方法(不确定它是否足够健壮,不再抛出异常,但经过几次测试运行后,它们都通过了):我添加了一个“等待关键字”成功”并将语言验证移至新关键字:

VALIDATE PAGE LANGUAGE
  [Arguments]                        ${lang}
  ${doc lang}                        Get Element Attribute  css=html@lang
  Should Be True                     '${doc lang}'=='${lang}'

CHANGE LANGUAGE  
  [Arguments]                        ${lang}
  Select From List By Value          ${LANGUAGE SWITCH}  ?hl=${lang}
  Wait For Condition                 return document.readyState=="complete"
  Wait Until Keyword Succeeds        5  5s  VALIDATE PAGE LANGUAGE  ${lang}
Run Code Online (Sandbox Code Playgroud)

然后,我将这个“CHANGE LANGUAGE”关键字调用的次数与我需要测试的语言一样多。

我将此添加为答案而不是评论,以便我可以以更易读的方式显示代码。


Bry*_*ley 4

为了等待页面在用户操作(例如单击链接或按钮)后准备好进行测试,我发现似乎几乎无懈可击的算法是这样的:

  1. 获取对 html 元素的引用
  2. 执行将导致页面更改的操作(例如:单击链接或按钮)
  3. 等待 html 元素变得陈旧 - 这表明刷新已开始
  4. 等待document.readyState成为"complete"

第 4 步可能不是必需的,但也没什么坏处。

这对我的团队来说非常有效。这仍然可能会失败,因为您可能有一些异步 JavaScript 在document.readyState设置后运行,但根本没有通用的解决方案。

如果您的页面有一堆异步 JavaScript,您必须想出自己的方案才能知道页面何时最终准备好进行测试。例如,最后完成的作业可以设置一个标志,或者您可以等到没有挂起的异步作业等。

我不确定您是否可以使用机器人关键字执行上述操作,因为它依赖于硒staleness_of条件。不过,用 python 实现起来相当容易。

该解决方案的灵感来自这篇博文:How to get Selenium to wait for page load after a click

如果您使用我的机器人页面对象库,它会作为上下文管理器内置。