java - Selenium : How to solve org. openqa.selenium.InvalidElementStateException: 无效元素状态

标签 java selenium selenium-webdriver webdriver

我看过几篇在线文章,它们都指向 1 个方向,那就是当页面加载时找不到元素。在我的 setData() 中,您可以看到我尝试了一些操作,例如使用等待、隐式等待和第一次单击然后发送用户名。但是似乎没有任何效果。我还考虑过在 pageProperties 中使用“等待”,但后来改变了主意,因为这可能是一个糟糕的设计。

错误:

Exception in thread "main" org.openqa.selenium.InvalidElementStateException: invalid element state

系统信息:Windows 10,ChromeDriver 2.37.544315,chrome=65.0.3

代码:

public class Tour {

    public static WebDriver driver;

    //browser URL information
    public WebDriver getBrowser(String browser, String url){
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Downloads\\chromedriver.exe");

        if(browser.equals("cc")){
            driver= new ChromeDriver();
        }
        driver.get(url);
        return driver;
    }

    // User name and continue button property from 1st page
    public void pageUserNameProperty(String un){
        WebElement login=driver.findElement(By.xpath("//input[@id='usernameOrEmail']"));
        WebElement cont_btn=driver.findElement(By.xpath("//button[contains(@type,'submit')]"));

        //WebDriverWait wait = new WebDriverWait(driver,30);
        //wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='usernameOrEmail']")));
        login.sendKeys(un);
        cont_btn.click();

    }
    // Password and continue button property from 2nd page
    public void pagePassTourProperty(String psd){
        WebElement password=driver.findElement(By.xpath("//input[@id='password']"));
        WebElement lgn_btn=driver.findElement(By.xpath("//button[contains(@type,'submit')]"));

        //WebDriverWait wait = new WebDriverWait(driver,30);
        //wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='usernameOrEmail']")));
        password.sendKeys(psd);
        lgn_btn.click();

    }

    // Supply Data for test from excel
    public void setData(){
        Tour tour= new Tour();
        tour.getBrowser("cc", "https://wordpress.com/log-in");
        WebDriverWait wait = new WebDriverWait(driver,30);
        WebElement login_field=wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='usernameOrEmail']")));
        login_field.click();
        //driver.manage().timeouts().implicitlyWait(18, TimeUnit.SECONDS);
        tour.pageUserNameProperty("JoeThomas");
        //wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='passTour']")));
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        tour.pagePassTourProperty("psd231");
    }

    public static void main(String[] args) {
        Tour tour= new Tour();
        tour.setData();

    }

}

错误:

Starting ChromeDriver 2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7) on port 2644 
Only local connections are allowed. 
Apr 18, 2018 7:09:26 AM org.openqa.selenium.remote.ProtocolHandshake createSession 
INFO: Detected dialect: OSS 
Exception in thread "main" org.openqa.selenium.InvalidElementStateException: invalid element state   (Session info: chrome=65.0.3325.181)   
(Driver info: chromedriver=2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7),platform=Windows NT 10.0.15063 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 0 milliseconds Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-11T20:33:15.31Z' System info: host: 'XYZ', ip: '123', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_91' 
Driver info: org.openqa.selenium.chrome.ChromeDriver Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.37.544315 (730aa6a5fdba15..., userDataDir: C:\Users\CHQ-SH~1\AppData\L...}, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 65.0.3325.181, webStorageEnabled: true} 
Session ID: 3298d88e517d756790ab6792e45257f1    
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)    

感谢您的宝贵时间和建议。

实验:

public class Tour {

    public static WebDriver driver;

    //browser URL information
    public WebDriver getBrowser(String browser, String url){
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\chq-sheikhr\\Downloads\\chromedriver.exe");

        if(browser.equals("cc")){
            driver= new ChromeDriver();
        }
        driver.get(url);
        return driver;
    }

    // User name and continue button property from 1st page
    public void pageUserNameProperty(String un){
        WebElement login=driver.findElement(By.xpath("//input[@id='usernameOrEmail']"));
        WebElement cont_btn=driver.findElement(By.xpath("//button[contains(@type,'submit')]"));

        login.sendKeys(un);
        cont_btn.click();

    }
    // Password and continue button property from 2nd page
    public void pagePasswordProperty(String psd){
        WebElement password=driver.findElement(By.xpath("//input[@id='password']"));
        WebElement lgn_btn=driver.findElement(By.xpath("//button[contains(@type,'submit')]"));

        password.sendKeys(psd);
        lgn_btn.click();
    }

    // A method - isElementExists to check whether that element exists or not
    public boolean isElementExists(By xpath){
        return driver.findElements(By.xpath("//input[@id='usernameOrEmail']")).size() > 0;
    }

    /*create a method waitForElement and pass wait time in seconds to it, it is not a hard code wait as it
     *  will continuously check whether that element is exist or not and then it will wait for 1 seconds on 
     *  every iteration of for loop
     */
    public boolean waitForElement(int timeInSeconds, By xpath){
        try{
            for(int i=0;i<timeInSeconds;i++){
                if(isElementExists(xpath))
                    return true;
                Thread.sleep(1000);
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return false;
    }

    public void setData(){
        Tour tour= new Tour();
        tour.getBrowser("cc", "https://wordpress.com/log-in");
        tour.waitForElement(10, By.xpath("//input[@id='usernameOrEmail']"));
        tour.pageUserNameProperty("JoeThoman");
        tour.pagePasswordProperty("pasd123");


    }

    public static void main(String[] args) {
        Tour tour= new Tour();
        tour.setData();
    }

}

最佳答案

这个错误信息...

Exception in thread "main" org.openqa.selenium.InvalidElementStateException: invalid element state

...表示您尝试与之交互的元素处于无法执行操作的状态。


无效元素状态异常

InvalidElementStateExceptionWebDriverException 的一种这表示您尝试与之交互的 WebElement 处于无法对其执行操作的状态。当一个元素在单击时被另一个元素遮挡或所需元素可能在 HTML DOM 上不可见时,可能会出现此类情况。 .


解决方案

您必须考虑以下几个事实:

  • 切勿将 implicitlyWait()WebDriverWait() 混淆为 documentation明确提到以下内容:

Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example setting an implicit wait of 10 seconds and an explicit wait of 15 seconds, could cause a timeout to occur after 20 seconds.

因此您需要删除所有 implicitlyWait() 实例。

  • 因为您需要发送字符电子邮件地址或用户名字段,所以不用ExpectedConditions方法visibilityOfElementLocated()你需要使用elementToBeClickable()方法。
  • 访问 url https://wordpress.com/log-in 并将字符发送电子邮件地址或用户名的简单脚本字段如下:

    System.setProperty("webdriver.gecko.driver", "C:/path/to/geckodriver.exe");
    WebDriver driver =  new FirefoxDriver();
    driver.get("https://wordpress.com/log-in");
    new WebDriverWait(driver,30).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@id='usernameOrEmail']"))).sendKeys("JoeThomas");
    
  • WebClient 的快照:

WebClient


更新

根据您评论中的反问,WebDriverWait 轮询 HTML DOM以一定的时间间隔(默认 500 毫秒)直到配置的时间量(在您的情况下为 30 秒)。一旦 ExpectedConditions 返回元素。被满足。例如,如果在 1 秒内找到所需的元素,则返回它并执行下一行代码。不涉及延迟。根据 WebDriverWait构造函数,您始终可以配置 timeOutInSecondssleepInMillis,即轮询间隔。


引用

您可以在以下位置找到详细讨论:

关于java - Selenium : How to solve org. openqa.selenium.InvalidElementStateException: 无效元素状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49902198/

相关文章:

java - 未找到 Android 服务(接触变化检测)

Java - 实现动态大小对象数组的最佳方式

java - 我可以强制生成 JVM 崩溃日志文件吗?

java - 有人可以告诉我如何在主类中调用我的方法吗

python - 如何使用 selenium 和 Scrapy 从 Flipkart 等动态网站中提取数据?

python - 使用selenium爬取SPA网页,得到错误数据

javascript - Selenium-Webdriver, driver.findElement(...).getLocation 不是一个函数,为什么?

java - 在 appium android 自动化中找不到 MobileElement

javascript - Selenium(网络驱动程序)- 无法单击拆分按钮的右边缘(请参见图片链接)

python - 如何在 python 中使用 webdriver 识别 http 链接的元素