我有一个方法,我试图添加12个web元素:
private List<WebElement> iphoneSnippetList = new ArrayList<>();
@Test
public void test(){
chromeDriver.get("https://market.yandex.ru/catalog--smartfony/54726/list?hid=91491&glfilter=7893318%3A153043&onstock=1&local-offers-first=0");
new WebDriverWait(chromeDriver, 15).until(ExpectedConditions.elementToBeClickable(By.xpath("//article[@data-autotest-id='product-snippet'][1]")));
for (int i = 0; i <= 12; i++) {
iphoneSnippetList.add((WebElement) By.xpath("//article[@data-autotest-id='product-snippet'][" + i + "]"));
}
System.out.println(iphoneSnippetList);
}
简化的DOM元素,我只需要得到文本:
<article class="_2vCnw cia-vs cia-cs" data-autotest-id="product-snippet"</article>
<article class="_2vCnw cia-vs cia-cs" data-autotest-id="product-snippet"</article>
<article class="_2vCnw cia-vs cia-cs" data-autotest-id="product-snippet"</article>
我需要将所有12个web元素添加到我的数组中,然后确保接收到的元素包含名称"Iphone",但是当添加元素时,有一个例外:
java.lang.ClassCastException: class org.openqa.selenium.By$ByXPath cannot be cast to class org.openqa.selenium.WebElement (org.openqa.selenium.By$ByXPath and org.openqa.selenium.WebElement are in unnamed module of loader 'app')
iphoneSnippetList
是Java-Selenium绑定中WebElement
的列表。
我不知道为什么你要使用循环添加12个web元素,而不是一个findElements
与正确的xpath
将是一个很好的选择。无论如何,你的代码中有一个与类型转换相关的问题。
看下面,driver.findElement
将返回web element
,我们将其存储到variable called Webelement e
中,并且添加iphoneSnippetList
for (int i = 0; i <= 12; i++) {
WebElement e = driver.findElement(By.xpath("//article[@data-autotest-id='product-snippet'][" + i + "]"));
iphoneSnippetList.add(e);
}
System.out.println(iphoneSnippetList);
同样,这个循环将为运行13次not12 times。如果你想让它运行12次,初始化i = 1
而不是i = 0
我想你会遇到xpath的问题此外,因为您没有正确使用xpath
indexing
。
试试这个:
for (int i = 1; i <= 12; i++) {
WebElement e = driver.findElement(By.xpath("(//article[@data-autotest-id='product-snippet'])['" +i+ "']"));
iphoneSnippetList.add(e);
}
System.out.println(iphoneSnippetList);