如何使用 C# 本地化在 Selenium WebDriver 中不断更改其 ID 中的数字的元素?



我试图在页面中找到一个拥有相当数量的相同元素的元素,元素之间的区别是一个ID在名称的末尾带有数字。 例如:

加载页面时唯一可见的:limit_arrown_btn_3201 但是,当系统中应用某些操作时,ID 末尾的此数字会更改。正因为如此,我没有办法映射元素来发送点击事件,因为当元素被更改时,ID 的最后数字会发生变化,从而使我的脚本崩溃......

我尝试使用CssSelector,但是所有其他的Caracteristics,如名称和类都是完全相同的。

是否有人经历过同样的情况,可以帮助我?

多谢。

您可以使用部分 id、包含*=或以^=开头

By.CssSelector([id*='limit_arrown_btn'])

在工作中,我们总是遇到这种情况。对我们来说,这通常是由于 extJS 动态重命名我们身上的元素而发生的。为了解决这个问题,我使用 xpath,通常会将 DOM 向上移动几个级别以找到一个独特的元素。然后,在控制台打开的情况下(Chrome 是我在这里选择的浏览器(,我单击和关闭动态变化的元素。发生这种情况时,Chrome 会突出显示哪些属性正在更改。这样,您可以看到哪些会改变,哪些不会改变,并定制您的 xpath 以匹配。例如,我们有一个使用随机生成的 ID 生成表的应用程序。我构建了一个实用程序类,您可以在其中传入一个 WebElement,该 Web 元素表示整个表包装器(页眉、正文、页脚等(和要查看的标题列的 String 值。由此,我得到了表列的动态 ID:(请原谅这些示例,因为它们是 Java 而不是 C#(

public String getGridColumnFromTable(WebElement tableDivElement, String headerColumn) {
WebElement newElement = waitUntilElementIsClickable(tableDivElement);
WebElement contextContainer = null;
String headerXPath = ".//child::div[contains(@id,'headercontainer')]/child::div/child::div/child::div/child::div/span[.='" + headerColumn + "']";
WebElement headerGridColumn = newElement.findElement(By.xpath(headerXPath));
waitUntilElementIsClickable(headerGridColumn);
String contextContainerXpath = ".//parent::div/parent::div";
contextContainer = headerGridColumn.findElement(By.xpath(contextContainerXpath));
String gridColumnID = contextContainer.getAttribute("id");
waitForPostBack();
return gridColumnID;
}

一旦我有了那个动态gridColumnID,我就用它来将所有其他函数绑定到它,如下所示:

public String getCellTextInTableByRowAndColumnName(WebElement tableDivElement, int rowNumber, String headerColumn) {
WebElement newElement = waitUntilElementIsClickable(tableDivElement);
String tableGridColumnId = getGridColumnFromTable(newElement, headerColumn);
return newElement.findElement(By.xpath(".//tbody/tr[contains(@data-recordindex, '" + rowNumber + "')]/td[contains(@class, '" + tableGridColumnId + "')]//div")).getText();
}

虽然这个例子对你来说可能有点陌生,因为你的项目很可能非常不同,但它确实展示了如何通过遍历 DOM 来找到你想要的元素来解决这个问题。

如果你有一些可以发布的html片段,这对定制答案最有帮助。

最新更新