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