我有一个包含动态IDs
,CSS
的动态链接列表,所有其他选项来获取元素列表对于某种方式都没用。使用contains()
。但是以哪种方式?
该列表包含XPATH
这样的值:
//a[@id='contentDataTable:4711:startMenu']/span
//a[@id='contentDataTable:4712:startMenu']/span
//a[@id='contentDataTable:4713:startMenu']/span
..
//a[@id='contentDataTable:4714:startMenu']/span
我无法使用的匹配,因为XPATH 1.0
仅支持Selenium。所以我正在寻找正确的contains()
电话......
第一个想法是
xpath=//a[contains(@id, 'contentDataTable:')]
但它不起作用。
我是如何尝试获取元素的:
public List<WebElement> getWebElements(Boolean isDebug, Boolean isHPOMDebug, RemoteWebDriver remWebDriver, String htmlType, String htmlValue, String actField) {
List<WebElement> webElements = null;
String webRequest = "";
try {
switch (htmlType) {
case "XPATH":
webRequest = htmlValue;
webElements = remWebDriver.findElements(By.xpath(webRequest));
break;
case "LINKTEXT":
webRequest = htmlValue;
webElements = remWebDriver.findElements(By.linkText(webRequest));
break;
case "LINKTEXTPART":
webRequest = htmlValue;
webElements = remWebDriver.findElements(By.partialLinkText(webRequest));
break;
case "CSS":
webRequest = htmlValue;
webElements = remWebDriver.findElements(By.cssSelector(webRequest));
break;
case "TAG":
webRequest = htmlValue;
webElements = remWebDriver.findElements(By.tagName(webRequest));
break;
case "ID":
webRequest = actField;
webElements = remWebDriver.findElements(By.id(webRequest));
break;
case "NAME":
webRequest = actField;
webElements = remWebDriver.findElements(By.name(webRequest));
break;
default:
webElements = null;
} // END OF INNER SWTICH
if (isDebug && webElements != null && webElements.size() > 1) {
logger.log(LogStatus.INFO, "getWebElements: " + webRequest + " FOUND: " + webElements.size());
for (int i=0;i<webElements.size(); i++) {
logger.log(LogStatus.INFO, "getWebElements: (" + i + ") TEXT = [" + webElements.get(i).getText() + "]");
logger.log(LogStatus.INFO, "getWebElements: (" + i + ") TAG = [" + webElements.get(i).getTagName() + "]");
logger.log(LogStatus.INFO, "getWebElements: (" + i + ") LOC = [" + webElements.get(i).getLocation() + "]");
}
report.flush();
}
}
catch (Exception e) {
e.printStackTrace();
webElements = null;
}
return(webElements);
}
答案 0 :(得分:1)
实际上你的xpath
是正确的,并且方法getWebElements(Boolean isDebug, Boolean isHPOMDebug, RemoteWebDriver remWebDriver, String htmlType, String htmlValue, String actField)
获取元素的Java代码看起来还不错。
您注释掉的行: -
我有一个空指针异常......我再次检查这个,也许我是一个idot
您正在获得NullPointerException
,因为您首先将webElements
变量初始化为null
,这是错误的。
您应该更改此行: -
List<WebElement> webElements = null;
到
List<WebElement> webElements = new ArrayList<WebElement>();
答案 1 :(得分:0)
很容易获得一个css选择器。 如果您使用以下选择器之一,Css应该可以正常工作:
a[id*=contentDataTable][id*=startMenu]
a[id*=contentDataTable]
&#13;
这个选择器的作用是:
- 查找具有包含contentDataTable的id的<a>
元素
- 对于相同的元素,我们可以添加另一个id应该包含startMenu
如果我们使用空格,例如:div a [id * = contentDataTable]将意味着找到一个元素<a>
,其id包含contentDataTable,但此元素应该在div中。
你可以做的另一件事是删除&#34;:&#34;从您的xpath,看看这是否是错误的问题。
css选择器在w3schools上得到了很好的解释,你会看到有一个基本选择器很少的表,你应该阅读它们以便更好地理解。
答案 2 :(得分:0)
如果它没有获得你需要的元素,那么页面上可能还有一些适合xpath的元素。你可以改善你的xpath;
webDriver.findElements(By.xpath("//a[contains(@id, 'contentDataTable') and contains(@id, 'startMenu')]"))