我正在运行一些脚本(在我的个人和商用笔记本电脑中),并且每天我在不同的步骤上都会收到不同的错误。是不可见的。
我已经包含了隐式等待,显式等待以及页面加载时间,但这无济于事。我该如何解决?

评论

我在Testim.io工作,我们对此进行了研究-您想要多深的答案?其中很多是使用睡眠和使用CSS选择器来选择事物。另一个很大的部分是实际点击的工作方式,并且在操作系统和浏览器之间是不同的。我们喜欢... 100K LoC规范化如何单击...

我们还编写了一个FOSS工具来帮助解决此问题,但它仅适用于伪装者/剧作家-让我们知道您是否希望在Selenium中看到它github.com/testimio/root-cause

@BenjaminGruenbaum如果您愿意就此发表博客文章大小的答案,那么我认为这不是问题。引用公司/组织所使用的产品时,只需确保在职位中公开从属关系即可。
@Mast听起来可能具有讽刺意味,但是因为我隶属于从事此工作的实体/公司,所以我尽量避免写这个(我宁愿在StackOverflow中回答问题,也希望在GitHub上从事OS方面的工作)-我进行了演讲在JSConf之类的几个地方(公开的隶属关系,<3日本)关于此的信息-这里有一些幻灯片:docs.google.com/presentation/d/…(徽标中提到了Testim,但幻灯片中没有提及)

#1 楼

不稳定脚本中的主要观察结果如下:

硒测试通常是不稳定的,因为在测试框架中创建了不必要的
复杂性
启用并行执行而无需记住一个测试可能会影响系统状态,进而影响并行运行的其他测试。
使用已弃用的模块
框架中使用的模块的配置不正确
不使用显式等待异步操作
使用不是用于测试被测软件的工具(例如,使用量角器而不是硒来测量角度网页)
在CI / CD测试代理中,在一个操作系统中开发测试并在另一个操作系统中运行测试操作系统和配置与开发PC中使用的操作系统和配置不同。

原因很多。此外,每当调查此类问题时,请按照所述顺序执行以下步骤:
1。相信您的代码并怀疑被测软件(SUT):
如果一切正常,测试突然开始失败。从检查实际产品开始,而不是调试代码中的问题。做一些视觉检查,查看开发团队是否已修改元素或不再显示该元素。
2。信任您的代码并怀疑环境:
如果在本地一切正常,并且在集成到CI / CD后立即失败了。然后在测试服务器中调查产品行为。主要由于操作系统和配置差异,该产品无法像在本地那样工作(引发错误)
3。现在怀疑您的脚本(使用绝对XPATH):
您可能正在使用绝对XPATH。当DOM结构更改时,这会导致测试不稳定。
使用相对的XPATH(建议使用CSS)。如果您具有唯一的ID /名称来标识元素,请不要使用xpath /。
4。现在怀疑您的脚本(不使用显式等待):
有时,脚本缺少明确的等待时间并尝试与动态元素进行交互,这会导致测试失败,因为它会在DOM中甚至没有可用之前就尝试与该元素进行交互。
5。现在,请怀疑您的脚本(处理微调器):
有时微调器需要一些时间才能显示出来。因此,如果您只是检查隐身条件,那么它将返回true并尝试在实际的spinner事件完成之前与下一个元素进行交互。与其他动态元素进行交互。
6。现在怀疑您的脚本(不处理iFrame):
有时某个元素将位于iframe中,并且脚本在与这些元素进行交互之前不会在框架之间切换。确定元素是否在iframe中。

评论


我本来要说“您的测试不稳定,因为它们的书写不佳”,但是这个答案好得多。

–伴侣Mrše
20-10-29在7:56

好答案。作为对第3点的扩展,我还要说-如果您没有唯一的ID /名称,请要求它们!对于开发人员来说,添加它通常是微不足道的,但是自动化带来的好处是巨大的。

– Moorpheus
20-10-29在12:31

@PD隐藏了我要表达的观点(我同意您的回答,这就是为什么我赞成它-并且是对第一条评论而不是您的帖子的回复),即使写“写得不错的测试”听起来很容易,一旦您有足够的数量,即使破损很小,也可能会很糟糕。

–本杰明·格伦鲍姆(Benjamin Gruenbaum)
20-10-29在15:46

希望,如果您甚至是远程敏捷者,并且开发人员通过自动测试对某项内容进行了有意的更改,您将被“圈中”,并且知道会提前失败,在这种情况下,您可以跳过一些这些步骤。尽管如果您的开发团队仍然遵循Waterfall(又名“保留开发人员的设计秘诀和测试人员的开发秘诀”),则可能并非如此。

–安德鲁·雷(Andrew Ray)
20-10-29在18:39

@PDHide我大都同意-但我认为,一旦达到相当大的规模,使测试变得稳定-可能会变得非常棘手。我已经看到了大公司(Microsoft / Salesforce / Autodesk / Wix等)进行的大量E2E测试,有些破绽令人惊讶(Testim对所有这些都做了正式描述。)。一些示例:更新React / Angular版本,更新库,新的Chrome版本,新的ChromeDriver / SafariDriver / GeckoDriver版本,网格xvfb版本更新,导致input_injector_x11行为稍有不同的Linux和x11操作系统,A / b测试工具和SDK当然是-新开发人员:]

–本杰明·格伦鲍姆(Benjamin Gruenbaum)
20-10-29在19:44

#2 楼

集成的测试越多,其稳定性就越差。这是因为它们涉及更多的环境因素。
基本上,Selenium测试不仅在构成您的AUT的软件组件方面进行了集成,而且还根据操作系统的特定版本,特定的浏览器版本,特定的图形进行了集成驱动程序版本或“无头”显示实现...
它们还与大量具有自身缺陷和其他特定功能的库“集成”在一起,并且具有特定的网络基础结构,可能会导致硬件路由或消息问题可能不够强大,不足以在稳定合理的时间内在Web浏览器中呈现组件。
因此,要使测试稳定,就必须稳定所有这些因素。如果这个问题对您确实很重要,那么最好在可以控制它们的虚拟化环境中组织测试执行。

评论


加上引入了左移测试,即。例如,进行集成测试(例如在REST API级别)而不是端到端测试。这将有助于隔离测试过的组件。

– dzieciou
20-10-28在18:44

什么是“ AUT”?

– Peter Mortensen
20-10-31在2:29

被测应用

– Alexey R.
20-10-31在8:38

#3 楼

您可能正在异步设备-Web浏览器上运行同步任务。
现代浏览器,框架和页面经常进行异步调用,例如API,供应商等。您的测试可能无法解决此问题,如果无法解决,则会因此而间歇性地失败,并结合其他因素,例如Alexey所详述。

#4 楼

一个有用的工具,它可以找出失败的原因以及为什么要对测试失败进行截图,并将其保存在测试输出中。这样,您可以查看确切的故障时刻页面的​​外观。这对于弄清测试失败的原因有很大的帮助。可以在https://www.browserstack.com/guide/take-screenshots-in-selenium中找到有关如何对故障进行屏幕截图的教程。
在某些情况下可以提供帮助的另一件事是配置驱动程序编写日志文件。在Java中,您可以这样操作:

#5 楼

好问题!创建和调试稳定的Selenium测试可能需要1-2天。除了此线程中的出色响应之外,如果您今天使用的是Selenium,那么每次对代码的更改最小时,无疑都将遇到此类错误: > -TimeoutException
-NoSuchAttributeException
这是因为Selenium使用单个选择器来标识元素,并且如果它们由于功能或代码更新而发生更改,则会破坏测试。如果需要重置,则有很多测试自动化供应商会以不同的方式解决问题,使用记录和回放来加快创作速度。
有些使用AI或多个属性来标识选择器以解决稳定性问题问题。我们的工程师坚信帮助全球团队为其项目获得最佳的自动化解决方案,并创建了一个计分工具,我想您会在这里享受到的。干杯。