我目前正在做一个项目,其中元素的xpath不断变化。在UI显示级别,UI没有太多可见的变化,但是DOM元素不断变化。
我正在考虑一种更好的方法来处理测试用例中由于DOM结构的微小变化而导致的失败。我目前正在使用Selenium和TestNg框架进行UI自动化测试。
任何关于替代方法的建议或方向都将是有帮助的。
发布于 2018-04-23 15:55:10
您是否遵循Selenium 贡献者建议的locators顺序:如果没有,请遵循以下顺序:
注意:在大多数情况下,cssSelector可以替代Xpath,但是Xpath具有cssSelector所不具备的优势。
有关更多参考信息,请访问此,因此链接:Css vs Xpath
发布于 2018-04-23 15:17:43
我的建议是: 1.尝试对特定的元素使用不同的定位器,比如selector1,selector2,selectorN。如果selector1在DOM中不可用,则控件不会抛出错误,而是搜索selector2,依此类推。2.使用显式等待
发布于 2018-04-23 16:14:53
我使用By.CSS选择器而不是xpath,因为它们不太容易在DOM中发生变化。
因此,对于这个示例dom:
<div class="smc-login-container">
<form role="form" action="/login.html" method="POST" name="login" class="ng-pristine ng-valid">
<!-- Username -->
<label for="username">User ID:</label>
<input type="text" class="smc-login-control aftLoginUsernameField" id="username" name="username">
<!-- Password -->
<label for="password">Password:</label>
<input type="password" class="smc-login-control aftLoginPasswordField" id="password" name="password">
<!-- Cross site scripting token -->
<input type="hidden" id="_csrf" name="_csrf" value="efaa05c4-77a8-443d-9484-51e8c9795c28">
<!-- Sign In Button -->
<button id="signIn" class="btn btn-lg btn-block smc-login-button aftLoginSignInButton">
Sign In
</button>
</form>
这些选择器可以工作:
示例1.查找按钮、元素类型和类
WebElement element = webDriver.findElement(By.cssSelector("button.btn"));示例2.查找按钮,直接子项而不是子项
使用完整的DOM,因此使用表单元素:
WebElement element = webDriver.findElement(By.cssSelector("div > form > button"));不使用表单元素:
WebElement element = webDriver.findElement(By.cssSelector("div button"));示例3.查找用户名标签后面的输入,属性值然后是它的同级(+)
WebElement element = webDriver.findElement(By.cssSelector("label[for='username'] + input"));示例4.查找密码输入和按钮,或(逗号)返回多个元素
List<WebElement> elements;
elements = webDriver.findElements(By.cssSelector("input.smc-login-control.aftLoginPasswordField , .btn"));
elements.get(0).sendKeys("my password");
elements.get(1).click();密码示例5.查找用户名输入,具有类属性,但没有属性=‘password’:
WebElement element = webDriver.findElements(By.cssSelector("input[class]:not([name='password'])"));我做的另一件事是使用更通用的模式,它可以找到多个项目。我发现这些项总是以相同的顺序找到,因此我只需使用数组索引就可以访问我想要的项(如示例4所示)。
最后,如果DOM有动态值,我发现我可以使用特定的稳定模式来找到具有相同动态值的父元素,从而提取它,然后重用它来找到我真正想要的其他元素。
https://stackoverflow.com/questions/49975177
复制相似问题