我想遍历页面的链接,但我的程序在两者之间被终止而不会抛出任何错误

时间:2017-09-10 06:05:23

标签: java selenium selenium-webdriver

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();

因为它没有显示文本(使用它来进行调试)我不明白程序终止的原因。

4 个答案:

答案 0 :(得分:0)

许多<a>代码,包括第一个代码,都没有文字,意味着

if (!(element.getText().isEmpty()))

第一轮中falsecurrentElement永远不会增加,并且您继续获得第一行<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++;