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.
我通读了这篇文章和这里的其他一些问题,并了解如果在获取元素引用后更新元素引用,可能会发生这种情况。但是,我不确定应该如何修改关键字以避免出现此错误。
使用每个人都非常友好地提供的信息,我可能已经找到了一个潜在的修复方法(不确定它是否足够健壮,不再抛出异常,但经过几次测试运行后,它们都通过了):我添加了一个“等待关键字”成功”并将语言验证移至新关键字:
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”关键字调用的次数与我需要测试的语言一样多。
我将此添加为答案而不是评论,以便我可以以更易读的方式显示代码。
为了等待页面在用户操作(例如单击链接或按钮)后准备好进行测试,我发现似乎几乎无懈可击的算法是这样的:
document.readyState成为"complete"第 4 步可能不是必需的,但也没什么坏处。
这对我的团队来说非常有效。这仍然可能会失败,因为您可能有一些异步 JavaScript 在document.readyState设置后运行,但根本没有通用的解决方案。
如果您的页面有一堆异步 JavaScript,您必须想出自己的方案才能知道页面何时最终准备好进行测试。例如,最后完成的作业可以设置一个标志,或者您可以等到没有挂起的异步作业等。
我不确定您是否可以使用机器人关键字执行上述操作,因为它依赖于硒staleness_of条件。不过,用 python 实现起来相当容易。
该解决方案的灵感来自这篇博文:How to get Selenium to wait for page load after a click
如果您使用我的机器人页面对象库,它会作为上下文管理器内置。
| 归档时间: |
|
| 查看次数: |
9498 次 |
| 最近记录: |