Java “元素”;id";在使用Selenium的测试自动化过程中检查元素时,某些网页中的更改(非静态)。如何处理这种情况?

Java “元素”;id";在使用Selenium的测试自动化过程中检查元素时,某些网页中的更改(非静态)。如何处理这种情况?,java,selenium-webdriver,xpath,css-selectors,webdriverwait,Java,Selenium Webdriver,Xpath,Css Selectors,Webdriverwait,我正在尝试使用SELENIUM中的测试自动化和chrome驱动程序捕获一个下拉菜单字段 为什么在使用Chrome浏览器不时检查元素时,某些网页中的元素“id”会发生变化?如何在不改变的情况下保持“id”的静态 我遵循的步骤: 当我检查网页中的元素时,特定的下拉菜单将其“id”显示为:id=“combo-1782-inputEl” HTML: <input id="combo-1782-inputEl**" type="text" class="x-form-field x-form-req

我正在尝试使用SELENIUM中的测试自动化和chrome驱动程序捕获一个下拉菜单字段

为什么在使用Chrome浏览器不时检查元素时,某些网页中的元素“id”会发生变化?如何在不改变的情况下保持“id”的静态

我遵循的步骤:

  • 当我检查网页中的元素时,特定的下拉菜单将其“id”显示为:id=“combo-1782-inputEl”
  • HTML:

    <input id="combo-1782-inputEl**" type="text" class="x-form-field x-form-required-field x-form-text x-trigger-noedit x-form-focus x-field-form-focus x-field-default-form-focus" autocomplete="off" name="type" readonly="readonly" aria-invalid="false" data-errorqtip="" style="width: 135px;">
    

    当我使用在步骤1中获得的“id”检查正常chrome浏览器中的网页时,我希望通过测试。chrome浏览器不受自动软件控制。

    使用Xpath和WebDriverWait处理动态元素。希望这能起作用

    WebDriverWait wait = new WebDriverWait(driver, 30);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//input[starts-with(@id, 'combo-')][@type='text']")));
    

    为了给您提供最佳答案,我需要查看网页的一部分HTML代码,足以让我看到其他属性。当您拥有动态ID时,您有两个选项:

    选项1:使用使用一个xpath,该xpath使用的部分ID是常量,即:

    /*[以(@id,'combo-')开头]

    可能会成功,但前提是没有其他类似的ID

    或许:

    /*[以(@id,'combo-')开头,以(@id,'-inputEl')结尾]

    但这可能还不够具体。这就是为什么查看HTML的一部分会有所帮助

    选项2:使用其他属性而不是ID,即类、文本或其他属性

    /*[@name='FirstName']

    比如说。您可以使用属性组合制作相当复杂的XPath,如果您做得正确,它将相当稳定。提高xpath创建技能对于类似的事情很有用。

    因为很明显,
    标记的id属性会动态变化,例如“combo-1782-inputEl”、“combo-1781-inputEl”等等,所以您需要创建一个动态定位器来引导WebDriverWait,并且您可以使用以下任一选项:

    • css选择器

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("input.x-form-field.x-form-required-field.x-form-text.x-trigger-noedit.x-form-focus.x-field-form-focus.x-field-default-form-focus[id$='-inputEl'][name='type']"))).click();
      
    • xpath

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[starts-with(@id, 'combo-') and @class='x-form-field x-form-required-field x-form-text x-trigger-noedit x-form-focus x-field-form-focus x-field-default-form-focus'][@name='type']"))).click();
      

    你可以参考link如果你有动态生成的ID,我建议使用contains,只获取ID的一部分。xpath(/*[contains(ID,'combo-178')])我建议去和创建它的开发人员谈谈,让他们将ID设置为静态,如果不可能,建议设置自定义数据标记(例如,
    数据webdriver id=“SOME-id”
    )。可测试性是一项功能。@比尔:谢谢你的解释。同一个网页中只有两个下拉菜单,它们的id中有相同的起始前缀和结束后缀。我尝试了你的解决方案,但后来我得到了org.openqa.selenium.InvalidSelectorException。我的代码中一定有错误。你能帮忙吗?下面是对于这两个字段:*1st drop menu field name=“Campaign type”/HTML code:*2nd drop menu field name=“Number mask”/HTML代码:由于提供了name属性,因此可以使用
    //input[@name='type']
    定位第一个字段,使用
    //input[@name='mt_port']定位第二个字段
    另外,为了将来的参考,最好将HTML代码添加到原始帖子中,而不是作为评论(我现在看到你似乎这样做了,但代码截图不受欢迎-突出显示的代码会更好)谢谢你。但我得到的是“class org.openqa.selenium.TimeoutException”使用此方法时。如何避免超时异常?TimeoutException是预期条件失败的结果。通过与
    Thread.sleep()
    连接的
    findElement()
    调试您的代码。如果您能够找到元素,请使用观察结果更新问题。谢谢。但我得到了一些提示使用此方法时使用“class org.openqa.selenium.TimeoutException”。如何避免超时异常?如果url是公共的,您可以共享它吗
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[starts-with(@id, 'combo-') and @class='x-form-field x-form-required-field x-form-text x-trigger-noedit x-form-focus x-field-form-focus x-field-default-form-focus'][@name='type']"))).click();