【问题标题】:Not able to click on link obtain using findElements method无法点击使用 findElements 方法获取的链接
【发布时间】:2019-02-19 15:04:30
【问题描述】:

这只是从网页的特定部分获取所有链接的简单代码;单击这些链接获取标题并返回父页面并重复下一个页面的过程。但点击 2 个链接后,我收到错误“陈旧的元素参考:元素未附加到页面文档”请参考代码,让我知道我缺少什么。

我能够在新标签中打开链接并获取子页面的标题。但我想在同一个标​​签中打开一个链接。

package test;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class LinkTest {

    public static void main (String[] args) throws InterruptedException{
        System.setProperty("webdriver.chrome.driver", "C:\\ChromeDriver\\1\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.qaclickacademy.com/practice.php");

        WebElement driverFooter = driver.findElement(By.xpath("//div[@id='gf-BIG']"));
        WebElement footerC1 = driverFooter.findElement(By.xpath("//table/tbody/tr/td/ul[1]"));
        List<WebElement> links = footerC1.findElements(By.tagName("a"));


        for(int i=0;i<links.size();i++){
            links.get(i).click();
            System.out.println(driver.getTitle());
            driver.navigate().back();


        }

    }
}

它应该打开所有链接并获取标题并返回父页面以进行下一个迭代器。下面是输出和错误,

Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
    [1550488224.725][WARNING]: Timed out connecting to Chrome, retrying...
    Practice Page
    REST API Tutorial
    Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
      (Session info: chrome=72.0.3626.109)
      (Driver info: chromedriver=2.46.628402 (536cd7adbad73a3783fdc2cab92ab2ba7ec361e1),platform=Windows NT 10.0.16299 x86_64) (WARNING: The server did not provide any stacktrace information)
    Command duration or timeout: 6 milliseconds
    For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
    Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15 17:00:58'
    System info: host: 'DS-SGH631RNL8', ip: '10.118.59.16', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_201'
    Driver info: org.openqa.selenium.chrome.ChromeDriver
    Capabilities [{mobileEmulationEnabled=false, timeouts={implicit=0, pageLoad=300000, script=30000}, hasTouchScreen=false, platform=XP, acceptSslCerts=false, goog:chromeOptions={debuggerAddress=localhost:53075}, acceptInsecureCerts=false, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=ignore, applicationCacheEnabled=false, rotatable=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.46.628402 (536cd7adbad73a3783fdc2cab92ab2ba7ec361e1), userDataDir=C:\Users\RUSHIK~1.KAD\AppData\Local\Temp\scoped_dir11700_2428}, takesHeapSnapshot=true, pageLoadStrategy=normal, strictFileInteractability=false, databaseEnabled=false, handlesAlerts=true, version=72.0.3626.109, browserConnectionEnabled=false, proxy={}, nativeEvents=true, locationContextEnabled=true, cssSelectorsEnabled=true}]
    Session ID: e1a6bdd0b525d1c6e1d940a2ec156e51
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
        at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
        at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:327)
        at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:85)
        at test.LinkTest.main(LinkTest.java:23)

【问题讨论】:

    标签: selenium selenium-webdriver


    【解决方案1】:

    当您尝试访问的元素在 dom 中不再可用或变得陈旧时,您会收到 StaleElementReferenceException,要纠正它,您需要再次选择元素然后对其进行操作。你可以修改你的代码:

    System.setProperty("webdriver.chrome.driver", "C:\\ChromeDriver\\1\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.qaclickacademy.com/practice.php");
    
    WebElement driverFooter = driver.findElement(By.xpath("//div[@id='gf-BIG']"));
    WebElement footerC1 = driverFooter.findElement(By.xpath("//table/tbody/tr/td/ul[1]"));
    List<WebElement> links = footerC1.findElements(By.tagName("a"));
    
    for(int i=0;i<links.size();i++){
    driverFooter = driver.findElement(By.xpath("//div[@id='gf-BIG']"));
    footerC1 = driverFooter.findElement(By.xpath("//table/tbody/tr/td/ul[1]"));
        List<WebElement> newLinks = footerC1.findElements(By.tagName("a"));
        newLinks.get(i).click();
        System.out.println(driver.getTitle());
        driver.navigate().back();
        driver.navigate().refresh();
    }
    

    【讨论】:

    • @Sameer:我试过了,但我仍然遇到同样的错误。但是,如果使用下面的代码 for(int i = 1; i
    • 已编辑我的答案,抱歉,我没有看到您也在循环中使用最后一页元素,因此您还需要再次使用这些元素。请检查更新的代码并告诉我它是否有效
    • @Sammer:是的,它奏效了。感谢您的信息:)
    • @Sammer:是的,它奏效了。感谢您的信息:)
    • 很高兴为您提供帮助!!请点击答案上的勾号图标接受答案
    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 2021-07-02
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    相关资源
    最近更新 更多