用于检查 Selenium WebDriver 中项目列表的循环
For loop for Checking list of items in Selenium WebDriver
我已经为检查列表 Web 元素编写了下面的代码,但是下面的代码是 运行 但是只有第一个项目没有循环到循环结束。
List <WebElement> listofItems = wd.findElements(By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img"));
for (int i=1; i<=listofItems.size(); i++)
{
listofItems.get(i).click();
wd.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
System.out.println(i);
System.out.println("pass");
wd.navigate().back();
}
可能的问题是 DOM 刷新。您无法找到列表并来回单击元素并引用同一列表,因为 DOM 在首次单击后已刷新。该问题的最佳解决方案是动态查找元素。此外,一旦您设置了隐式等待,该驱动程序实例就会固定等待。因此,您不必为每个元素查找设置等待。而是将其设置在实例化驱动程序的位置。(可能)。但是,我认为显式等待最适合这里。
By byXpath = By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img");
List <WebElement> listofItems = wd.findElements(byXpath);
for (int i=1; i<=listofItems.size(); i++)
{
//I would suggest you to see if you can improve the selector though
By by= By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img[" + i + "]");
WebElement myDynamicElement = (new wd(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(by));
System.out.println(i);
myDynamicElement.click();
wd.navigate().back();
}
@Saifur 已经很好地解释了这个问题。所以,我只会放一些能让你通过的代码
List <WebElement> listofItems = wd.findElements(By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img"));
WebDriverWait wait = new WebDriverWait(wd, 20); //Wait time of 20 seconds
for (int i=1; i<=listofItems.size(); i++)
{
/*Getting the list of items again so that when the page is
navigated back to, then the list of items will be refreshed
again */
listofItems = wd.findElements(By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img"));
//Waiting for the element to be visible
//Used (i-1) because the list's item start with 0th index, like in an array
wait.until(ExpectedConditions.visibilityOf(listofItems.get(i-1)));
//Clicking on the first element
listofItems.get(i-1).click();
wd.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
System.out.print(i + " element clicked\t--");
System.out.println("pass");
wd.navigate().back();
}
所以,上面我只是对您的代码进行了一些调整,并提供了相关的注释,说明了更改的位置和原因。希望这对你有用。 :)
我已经为检查列表 Web 元素编写了下面的代码,但是下面的代码是 运行 但是只有第一个项目没有循环到循环结束。
List <WebElement> listofItems = wd.findElements(By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img"));
for (int i=1; i<=listofItems.size(); i++)
{
listofItems.get(i).click();
wd.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
System.out.println(i);
System.out.println("pass");
wd.navigate().back();
}
可能的问题是 DOM 刷新。您无法找到列表并来回单击元素并引用同一列表,因为 DOM 在首次单击后已刷新。该问题的最佳解决方案是动态查找元素。此外,一旦您设置了隐式等待,该驱动程序实例就会固定等待。因此,您不必为每个元素查找设置等待。而是将其设置在实例化驱动程序的位置。(可能)。但是,我认为显式等待最适合这里。
By byXpath = By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img");
List <WebElement> listofItems = wd.findElements(byXpath);
for (int i=1; i<=listofItems.size(); i++)
{
//I would suggest you to see if you can improve the selector though
By by= By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img[" + i + "]");
WebElement myDynamicElement = (new wd(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(by));
System.out.println(i);
myDynamicElement.click();
wd.navigate().back();
}
@Saifur 已经很好地解释了这个问题。所以,我只会放一些能让你通过的代码
List <WebElement> listofItems = wd.findElements(By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img"));
WebDriverWait wait = new WebDriverWait(wd, 20); //Wait time of 20 seconds
for (int i=1; i<=listofItems.size(); i++)
{
/*Getting the list of items again so that when the page is
navigated back to, then the list of items will be refreshed
again */
listofItems = wd.findElements(By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img"));
//Waiting for the element to be visible
//Used (i-1) because the list's item start with 0th index, like in an array
wait.until(ExpectedConditions.visibilityOf(listofItems.get(i-1)));
//Clicking on the first element
listofItems.get(i-1).click();
wd.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
System.out.print(i + " element clicked\t--");
System.out.println("pass");
wd.navigate().back();
}
所以,上面我只是对您的代码进行了一些调整,并提供了相关的注释,说明了更改的位置和原因。希望这对你有用。 :)