【发布时间】:2019-06-12 18:32:03
【问题描述】:
我正在尝试在使用 reactjs 构建的网页上使用 Selenium 编写网络驱动测试。我可以通过 xpath 抓取我的元素,但这并不理想而且非常有限。
- 如果网站发生任何更改,xpath 将不起作用。
- 所有类名都是相同的,没有其他要抓取的属性,类名也会发生变化,因为它们是由 react 动态构建的。
- 没有其他属性可供使用。
- 不能使用 CSSSelector,因为 CSS 名称也是由 react 构建的。
当我想要一个特定元素时,我的主要问题不断出现,例如我刚刚构建的元素或如何操作列表中的特定元素。
对于我尝试编写的每个测试,我总是遇到同样的问题,没有唯一标识符。我不熟悉 reactJs,但这是 Selenium 的常见问题吗?
【问题讨论】:
-
听起来像 React 组件,它们的设计对 React 单元测试之外的可测试性为零。你说得对,使用 XPath 会让人流泪。开发组件的人应该提供某种形式的不会改变(或至少不会改变太多)的身份。 如何类名是如何构造的并不重要;使用一致的东西来允许外部集成测试只是一个好主意。
-
是的,这个网页最初是在没有自动化测试意图的情况下创建的。那么在目前的状态下,有没有办法在这种环境中使用硒呢?
-
@Jesse Bell,XPath 与 CSS 选择器或 ID 一样可靠。使定位器脆弱的原因是树依赖性和依赖于自动生成/无意义的属性。例如
by.xpath("id('myid')")与by.css("[id='myid']")或by.id("myid")一样可靠。请注意,您还可以选择使用 JavaScript 注入或 XPath(.//*[not(./*)][normalize-space()='my text']或.//*[string()[contains(., 'my text')]])通过文本定位元素。