public class CountingBrokenLinks {
static int count = 0;
static int currentElement = 0;
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\\Selenium Drivers\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, 100);
driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
driver.get("http://www.hindustantimes.com/");
driver.manage().window().maximize();
wait.until(ExpectedConditions.elementToBeClickable(By.id("amenu-india-col")));
List<WebElement> listOfLinks = driver.findElements(By.tagName("a"));
int noOfLinks = listOfLinks.size();
for (int i = 0; i < noOfLinks; i++) {
WebElement element = listOfLinks.get(currentElement);
if (!(element.getText().isEmpty())) {
String linkText = element.getText();
System.out.println(linkText);
driver.findElement(By.linkText(linkText)).click();
String title = driver.getTitle();
if (title.contains("error")) {
count++;
}
driver.navigate().back();
wait.until(ExpectedConditions.elementToBeClickable(By.id("amenu-india-col")));
listOfLinks = driver.findElements(By.tagName("a"));
currentElement++;
}
}
}
}
我想访问http://www.hindustantimes.com/并浏览页面中的所有链接。如果任何页面标题包含单词“Error”,我想增加计数。
以前我收到StaleElement
异常,但我再次初始化列表并维护索引我正在使用静态变量。
程序在此行终止: -
String linkText = element.getText();
因为它没有显示文本(使用它来进行调试)我不明白程序终止的原因。
答案 0 :(得分:0)
许多<a>
代码,包括第一个代码,都没有文字,意味着
if (!(element.getText().isEmpty()))
第一轮中false
是currentElement
永远不会增加,并且您继续获得第一行<a>
标记
WebElement element = listOfLinks.get(currentElement);
不使用变量,只需使用循环中的i
索引
for (int i = 0; i < noOfLinks; i++) {
WebElement element = listOfLinks.get(i);
//...
}
你的程序没有在element.getText();
上终止,它会一直运行,直到循环条件不再有效。
答案 1 :(得分:0)
您的程序看起来很好,但您应该更改以下代码行:
WebElement element = listOfLinks.get(currentElement);
到
WebElement element = listOfLinks.get(i);
因为您将currentElement
值设置为0
,所以您的代码不会遍历列表中的所有元素。
答案 2 :(得分:0)
只需传递i
而不是currentElement
,您的代码就像这样
for (int i = 0; i < noOfLinks; i++) {
WebElement element = listOfLinks.get(i);
if (!(element.getText().isEmpty())) {
String linkText = element.getText();
System.out.println(linkText);
driver.findElement(By.linkText(linkText)).click();
String title = driver.getTitle();
if (title.contains("error")) {
count++;
}
driver.navigate().back();
wait.until(ExpectedConditions.elementToBeClickable(By.id("amenu-india-col")));
listOfLinks = driver.findElements(By.tagName("a"));
currentElement++;
}
}
答案 3 :(得分:0)
您可以使用Iterator接口在元素之间进行迭代,而不是使用if
循环。如果有效,请告诉我。
List<WebElement> listOfLinks = driver.findElements(By.tagName("a"));
Iterator <WebElement> it = listOfLinks.iterator();
while(it.hasNext())
{
WebElement element = it.next();
if (!(element.getText().isEmpty())) {
String linkText = element.getText();
System.out.println(linkText);
driver.findElement(By.linkText(linkText)).click();
String title = driver.getTitle();
if (title.contains("error")) {
count++;
}
driver.navigate().back();
wait.until(ExpectedConditions.elementToBeClickable(By.id("amenu-india-col")));
listOfLinks = driver.findElements(By.tagName("a"));
currentElement++;