Selenium / getElements 通过 XPATH 和 CONTAINS (JAVA)
Selenium / getElements By XPATH and CONTAINS (JAVA)
我有一个动态链接列表,其中还有动态 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);
}
很容易为此获得一个css选择器。
Css 如果您使用以下选择器之一,应该可以正常工作:
a[id*=contentDataTable][id*=startMenu]
a[id*=contentDataTable]
这个选择器的作用是:
- 找到 ID 包含 contentDataTable 的 <a>
元素
- 对于相同的元素,我们可以添加另一个条件,即 id 还应包含 startMenu
如果我们使用 space,例如:div a[id*=contentDataTable] 将意味着找到一个元素 <a>
,其 id 包含 contentDataTable,但是此元素应位于 div.
内
您可以做的另一件事是从您的 xpath 中删除“:”,看看这是否是错误的原因。
Css 选择器在 w3schools 上有很好的解释,你会看到 table 基本选择器很少,你应该阅读它们以更好地理解。
如果它没有获得您需要的元素,那么页面上可能还有一些其他元素适合 xpath。您可以像这样改进您的 xpath;
webDriver.findElements(By.xpath("//a[contains(@id, 'contentDataTable') and contains(@id, 'startMenu')]"))
实际上你的 xpath
是正确的,你的 Java 方法 getWebElements(Boolean isDebug, Boolean isHPOMDebug, RemoteWebDriver remWebDriver, String htmlType, String htmlValue, String actField)
获取元素的代码看起来也不错。
您注释掉的行:-
I got an null pointer exception... I check this again, perhaps I am an idot
你得到 NullPointerException
因为你将第一个 webElements
变量初始化为 null
这是错误的。
你应该改变这一行:-
List<WebElement> webElements = null;
到
List<WebElement> webElements = new ArrayList<WebElement>();
我有一个动态链接列表,其中还有动态 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);
}
很容易为此获得一个css选择器。 Css 如果您使用以下选择器之一,应该可以正常工作:
a[id*=contentDataTable][id*=startMenu]
a[id*=contentDataTable]
这个选择器的作用是:
- 找到 ID 包含 contentDataTable 的 <a>
元素
- 对于相同的元素,我们可以添加另一个条件,即 id 还应包含 startMenu
如果我们使用 space,例如:div a[id*=contentDataTable] 将意味着找到一个元素 <a>
,其 id 包含 contentDataTable,但是此元素应位于 div.
您可以做的另一件事是从您的 xpath 中删除“:”,看看这是否是错误的原因。
Css 选择器在 w3schools 上有很好的解释,你会看到 table 基本选择器很少,你应该阅读它们以更好地理解。
如果它没有获得您需要的元素,那么页面上可能还有一些其他元素适合 xpath。您可以像这样改进您的 xpath;
webDriver.findElements(By.xpath("//a[contains(@id, 'contentDataTable') and contains(@id, 'startMenu')]"))
实际上你的 xpath
是正确的,你的 Java 方法 getWebElements(Boolean isDebug, Boolean isHPOMDebug, RemoteWebDriver remWebDriver, String htmlType, String htmlValue, String actField)
获取元素的代码看起来也不错。
您注释掉的行:-
I got an null pointer exception... I check this again, perhaps I am an idot
你得到 NullPointerException
因为你将第一个 webElements
变量初始化为 null
这是错误的。
你应该改变这一行:-
List<WebElement> webElements = null;
到
List<WebElement> webElements = new ArrayList<WebElement>();