Java “元素”;id";在使用Selenium的测试自动化过程中检查元素时,某些网页中的更改(非静态)。如何处理这种情况?
我正在尝试使用SELENIUM中的测试自动化和chrome驱动程序捕获一个下拉菜单字段 为什么在使用Chrome浏览器不时检查元素时,某些网页中的元素“id”会发生变化?如何在不改变的情况下保持“id”的静态 我遵循的步骤: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
<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();
数据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();