Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium UI自动化测试中的人工智能_Selenium_Automation_Artificial Intelligence_Ui Automation - Fatal编程技术网

Selenium UI自动化测试中的人工智能

Selenium UI自动化测试中的人工智能,selenium,automation,artificial-intelligence,ui-automation,Selenium,Automation,Artificial Intelligence,Ui Automation,我目前正在从事一个项目,其中元素的xpath不断变化。在UI显示级别,UI中没有太多可见的变化,但是DOM元素不断变化。 我正在考虑一种更好的方法来处理由于DOM结构的微小变化而导致的测试用例失败。我目前正在使用Selenium和TestNg框架进行UI自动化测试 任何关于替代方法的建议或指示都会有帮助。我的建议是: 1.尝试对特定元素使用不同的定位器[ 类似于selector1、selector2、selectorN。如果selector1在DOM中不可用,控件将不会抛出错误,而是搜索sele

我目前正在从事一个项目,其中元素的xpath不断变化。在UI显示级别,UI中没有太多可见的变化,但是DOM元素不断变化。
我正在考虑一种更好的方法来处理由于DOM结构的微小变化而导致的测试用例失败。我目前正在使用Selenium和TestNg框架进行UI自动化测试
任何关于替代方法的建议或指示都会有帮助。

我的建议是: 1.尝试对特定元素使用不同的定位器[ 类似于selector1、selector2、selectorN。如果selector1在DOM中不可用,控件将不会抛出错误,而是搜索selector2,依此类推 2.使用显式等待我的建议是: 1.尝试对特定元素使用不同的定位器[ 类似于selector1、selector2、selectorN。如果selector1在DOM中不可用,控件将不会抛出错误,而是搜索selector2,依此类推
2.使用显式等待

您是否遵循Selenium贡献者建议的定位器的顺序:如果没有,请遵循以下顺序:

  • ID
  • 名称
  • 类名
  • 链接文本
  • partialLinkText
  • 标记名
  • css选择器
  • XPath
  • 注意:大多数情况下,cssSelector可以取代Xpath,但是Xpath有其自身的优势,而cssSelector没有提供这些优势


    有关更多参考信息,请浏览此SO链接:

    您是否遵循Selenium贡献者建议的定位器的顺序:如果没有,请遵循以下顺序:

  • ID
  • 名称
  • 类名
  • 链接文本
  • partialLinkText
  • 标记名
  • css选择器
  • XPath
  • 注意:大多数情况下,cssSelector可以取代Xpath,但是Xpath有其自身的优势,而cssSelector没有提供这些优势


    有关更多参考信息,您可以浏览此链接:

    我使用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>
    
    示例2.查找按钮,直接子代而非子代

    使用完整的DOM,从而形成元素:

    WebElement element = webDriver.findElement(By.cssSelector("div > form > button"));
    
    WebElement element = webDriver.findElement(By.cssSelector("div button"));
    
    不使用表单元素:

    WebElement element = webDriver.findElement(By.cssSelector("div > form > button"));
    
    WebElement element = webDriver.findElement(By.cssSelector("div button"));
    
    示例3。在用户名标签后面查找输入,属性值为,然后是同级(+)

    示例4。查找密码输入和按钮,或'd(逗号)返回多个元素

    List<WebElement> elements;
    elements = webDriver.findElements(By.cssSelector("input.smc-login-control.aftLoginPasswordField , .btn"));
    elements.get(0).sendKeys("my password");
    elements.get(1).click();
    
    我要做的另一件事是使用一个更通用的模式,它可以查找多个项。我发现这些项总是在相同的序列中找到的,因此我可以通过使用数组索引来访问我想要的项(如示例4)


    最后,如果DOM具有动态值,我发现我可以使用特定的稳定模式来查找具有相同动态值的父元素,从而提取它,然后重新使用它来查找我实际需要的其他元素。

    我使用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>
    
    示例2.查找按钮,直接子代而非子代

    使用完整的DOM,从而形成元素:

    WebElement element = webDriver.findElement(By.cssSelector("div > form > button"));
    
    WebElement element = webDriver.findElement(By.cssSelector("div button"));
    
    不使用表单元素:

    WebElement element = webDriver.findElement(By.cssSelector("div > form > button"));
    
    WebElement element = webDriver.findElement(By.cssSelector("div button"));
    
    示例3。在用户名标签后面查找输入,属性值为,然后是同级(+)

    示例4。查找密码输入和按钮,或'd(逗号)返回多个元素

    List<WebElement> elements;
    elements = webDriver.findElements(By.cssSelector("input.smc-login-control.aftLoginPasswordField , .btn"));
    elements.get(0).sendKeys("my password");
    elements.get(1).click();
    
    我要做的另一件事是使用一个更通用的模式,它可以查找多个项。我发现这些项总是在相同的序列中找到的,因此我可以通过使用数组索引来访问我想要的项(如示例4)


    最后,如果DOM具有动态值,我发现我可以使用特定的稳定模式来查找具有相同动态值的父元素,从而提取它,然后重新使用它来查找我实际需要的其他元素。

    我们已经在某些地方使用了多个选择器,但问题是大多数元素没有id和sometim在xpath中,DOM结构有一个小的变化,这会导致测试用例失败。我们已经在一些地方使用了多个选择器,但问题是大多数元素没有id,有时在xpath中,DOM结构有一个小的变化,这会导致测试用例失败。短语
    更好的方法
    你的意思是人工智能?例如:-如果DOM结构发生微小变化,则保存按钮将或多或少处于相同的位置。跟踪事件序列并向单击事件添加元数据将有所帮助。因此,如果失败,我可以检查备用按钮并继续执行。
    保存按钮将或多或少处于相同的位置如果DOM中有一个小的变化,则显示相同的位置。
    显然是正确的,但逻辑上/功能上/事实上是错误的。
    更好的方法
    你指的是人工智能吗?例如:-如果DOM结构中有一个小的变化,则保存按钮或多或少会处于相同的位置。跟踪事件序列并添加g单击事件的元数据将有所帮助。因此,如果出现故障,我可以检查备用按钮并继续执行。
    如果DOM中有一个小的更改,则保存按钮将或多或少处于相同的位置
    显然是正确的,但在逻辑/功能/事实上是错误的