我正在尝试使用 Selenium+TestNg 自动化 Ember.js 应用程序。
应用程序中的下拉列表只有一个对象属性 ID。但是,每次我刷新页面 id 都会发生变化并且没有模式。例如:第一次打开页面 id=ember1398,当我刷新页面时,相同的对象 id 更改为 ember1097。
如果有人能指导我克服这一挑战,我将不胜感激。如有必要,我愿意更改工具/框架。
我正在尝试使用 Selenium+TestNg 自动化 Ember.js 应用程序。
应用程序中的下拉列表只有一个对象属性 ID。但是,每次我刷新页面 id 都会发生变化并且没有模式。例如:第一次打开页面 id=ember1398,当我刷新页面时,相同的对象 id 更改为 ember1097。
如果有人能指导我克服这一挑战,我将不胜感激。如有必要,我愿意更改工具/框架。
由于所需的元素是启用了EmberJS的元素,因此某些属性(例如id )将动态生成。例如,ember371
、ember382
、ember393
等。在这些情况下,您将无法使用id
属性的完整值来定位元素。例如,考虑以下元素:
<input placeholder="" id="ember32" class="ssRegistrationField ssEmailTextboxField ember-text-field ember-view" type="email">
每次您访问AUT(Application Under Test)时,该属性的值id
都会动态变化。因此,要定位元素,解决方案是构造动态定位器策略,以诱导WebDriverWait与ExpectedConditions结合,如下所示: visibilityOfElementLocated()
cssSelector
:
WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input.ssRegistrationField.ssEmailTextboxField.ember-text-field.ember-view[id^='ember']")));
xpath
:
WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[starts-with(@id, 'ember') and @class='ssRegistrationField ssEmailTextboxField ember-text-field ember-view']")));
这是 Ember 的一个已知问题。我们与许多第三方应用程序合作以与它们集成,因此我们使用 selenium 进行了大量自动化测试,当他们使用 ember 时,我们遇到了这个问题,这意味着我们无法像与其他合作伙伴一样测试代码。我确信使用 Ember 有充分的理由,但能够使用 Selenium 轻松测试它并不是其中之一。在 ember 中打开了一个错误,但它被关闭了。
https://github.com/emberjs/ember.js/issues/11834
在 ember 修复此问题之前,我的建议是使用不同的 JS 框架,该框架旨在由第三方使用 JS 和/或框架本身以外的东西进行测试。