我正在测试使用Java和Selenium的Web应用程序。我试图在页面上单击一个按钮,该页面上存在两个具有相同类名和文本的按钮。因此,我先找到父元素,然后在其子元素中寻找我的按钮。我正在执行以下操作,并得到了意外的结果。
public static List<WebElement> findSubElementsUsingHtmlXpathClass(String htmlElement,
String className, WebElement parent) {
String xPathString="//" + htmlElement + "[contains(@class, '" + className + "')]";
List<WebElement> elements = parent.findElements(By.xpath(xPathString));
return elements;
}
这将返回不属于父元素的元素。
这是我从以下位置拨打电话的地方:
String htmlElement = "div";
String className = "tabs-container";
List<WebElement> elements = Common.findElementsUsingHtmlXpathClass(driver, htmlElement, className);
Common.myPrint(thisClass + " no of elements found: " + elements.size());
for (WebElement element : elements) {
// outerHTML: <input class="form-control btn btn-info" value="Create item"
// type="button">
// inner:
String htmlElement2 = "input";
String className2 = "form-control btn btn-info";
String textToFind = "Create item";
List<WebElement> subElements = Common.findSubElementsUsingHtmlXpathClass(htmlElement2, className2,
element);HTML
我想念什么吗?
我已经能够解决此问题,只需忽略它返回的第一个元素,但这只能在特定情况下得到保证。
答案 0 :(得分:2)
您的XPath需要进行如下更改(需要在双斜杠之前添加。)。您需要从当前父元素中选择子元素。因此,在Xpath中,。需要指定以将其指示为当前节点。
public static List<WebElement> findSubElementsUsingHtmlXpathClass(String htmlElement,
String className, WebElement parent) {
String xPathString=".//" + htmlElement + "[contains(@class, '" + className + "')]";
List<WebElement> elements = parent.findElements(By.xpath(xPathString));
return elements;
}
答案 1 :(得分:0)
尝试使用CSS-Selector代替XPath:
public static List<WebElement> findSubElementsUsingCSS(String className, WebElement parent) {
String cssString="." + className;
List<WebElement> elements = parent.findElements(By.cssSelector(cssString));
return elements;
}