我有大约200个元素的标记如下:
<span id="1356329740258" class="pagename">Sport & leisure</span>
<span id="1356329740259" class="pagename">Food & drink</span>
<span id="1356329740260" class="pagename">Household</span>
<span id="1356329740261" class="pagename">Gardening</span>
我可以用相当难看的方式使用Webdriver访问它们:
List<WebElement> elements;
elements = driver.findElements(By.xpath( ".//*[starts-with(@id, '135')]"));
...因为每个都以'135'开头。
但是driver.findElement(By.cssSelector(".pagename");
......不起作用,也许与''标签
我现在需要做的是为列表中的每个元素执行.getText()并根据预期的相应数组值进行验证。我开始考虑这种方法:
String[] expected = {"Sport & leisure", "Food & drink", "Household", "Gardening"};
List<WebElement> elements = select.find.Elements(By.xpath( ".//*[starts-with(@id,'135')]"));
// compare #array items with #found elements in List
if (expected.length != elements.size()) {
System.out.println("the wrong number of elements were found");
}
// check value of every pagename class element equals expected value
for (int i = 0; i < expected.length; i++) {
String elementsValue = elements.get(i).getAttribute("value");
if (elementsValue.equals(expected[i])) {
System.out.println("passed on: " + elements);
} else {
System.out.println("failed on: " + elements);
}
}
这有明显的局限性,可能需要在数组中存储200个奇数文本字符串,因此会变得难以处理。有更优雅的解决方案吗?我可以从.csv中读取数组值并猜测并使用参数化运行器但是我还需要在构造函数中声明每个值吗?
答案 0 :(得分:4)
您可以使用列表contains
或containsAll
函数来确定相等性。所以基本上是这样的:
final List<String> expectedElements = readFromCSV("expectedElements.csv");
final List<WebElement> elements = select.find.Elements(By.xpath( ".//*[starts-with(@id,'135')]"));
final List<String> stringElements = new ArrayList<>(elements.length);
for (WebElement element : elements) {
stringElements.add(element.getAttribute("value"));
}
final boolean isSame = stringElements.containsAll(expectedElements);
答案 1 :(得分:1)
这不是您问题的直接答案,只是对您的代码进行了一些更正:
1
您可以替换您认为“丑陋”的代码:
List<WebElement> elements = select.findElements(By.xpath(".//*[starts-with(@id,'135')]"));
使用代码查找使用class
属性的元素:
List<WebElement> elements = select.findElements(By.xpath("//span[@class='pagename']"));
2
由于这些元素中没有value
属性,因此您应该替换以下行:
String elementsValue = elements.get(i).getAttribute("value");
使用:
String elementsValue = elements.get(i).getAttribute("innerHTML");