Selenium:如何解决 org.openqa.selenium.InvalidElementStateException:无效元素状态
我已经阅读了一些在线文章,它们都指向一个方向,即页面加载时找不到元素.在我的 setData() 中,您可以看到我尝试了一些方法,例如使用等待、隐式等待和第一次单击,然后发送用户名.然而,似乎没有任何工作.我也想过在 pageProperties 中使用等待",但后来改变了主意,因为这可能是一个糟糕的设计.
错误:
线程main"org.openqa.selenium.InvalidElementStateException 中的异常:无效元素状态
系统信息:Windows 10、ChromeDriver 2.37.544315、chrome=65.0.3
代码:
公开课导览{公共静态 WebDriver 驱动程序;//浏览器URL信息公共WebDriver getBrowser(字符串浏览器,字符串url){System.setProperty("webdriver.chrome.driver", "C:\Users\Downloads\chromedriver.exe");if(browser.equals("cc")){驱动程序=新的 ChromeDriver();}driver.get(url);回程司机;}//从第一页开始的用户名和继续按钮属性公共无效页面用户名属性(字符串 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();}//第二页的密码和继续按钮属性公共无效pagePassTourProperty(字符串psd){WebElement 密码=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']")));密码.sendKeys(psd);lgn_btn.click();}//为 excel 测试提供数据公共无效 setData(){游览=新游览();tour.getBrowser("cc", "https://wordpress.com/log-in");WebDriverWait 等待 = 新的 WebDriverWait(驱动程序,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");}公共静态无效主要(字符串[]参数){游览=新游览();tour.setData();}}
错误:
在端口 2644 上启动 ChromeDriver 2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7)只允许本地连接.2018 年 4 月 18 日上午 7:09:26 org.openqa.selenium.remote.ProtocolHandshake createSession信息:检测到的方言:OSS线程主"org.openqa.selenium.InvalidElementStateException 中的异常:无效元素状态(会话信息:chrome=65.0.3325.181)(驱动程序信息:chromedriver=2.37.544315(730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7),平台=Windows NT 10.0.15063 x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:0毫秒构建信息:版本:'3.11.0',修订:'e59cfb3',时间:'2018-03-11T20:33:15.31Z' 系统信息:主机:'XYZ',ip:'123',os.name:'Windows 10',os.arch:'amd64',os.version:'10.0',java.version:'1.8.0_91'驱动程序信息:org.openqa.selenium.chrome.ChromeDriver Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.37.544315 (730aa6a5fdba15 ..., userDataDir:C:UsersCHQ-SH~1AppDataL...},cssSelectorsEnabled:true,databaseEnabled:false,handlesAlerts:true,hasTouchScreen:false,javascriptEnabled:true,locationContextEnabled:true,mobileEmulationEnabled:false,nativeEvents:true,networkConnectionEnabled:false,pageLoadStrategy:正常,平台:XP,platformName:XP,可旋转:false,setWindowRect:true,takesHeapSnapshot:true,takeScreenshot:true,unexpectedAlertBehaviour:,unhandledPromptBehavior:,版本:65.0.3325.181,webStorageEnabled:true}会话 ID:3298d88e517d756790ab6792e45257f1在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
感谢您的宝贵时间和建议.
实验:
公开课导览{公共静态 WebDriver 驱动程序;//浏览器URL信息公共WebDriver getBrowser(字符串浏览器,字符串url){System.setProperty("webdriver.chrome.driver", "C:\Users\chq-sheikhr\Downloads\chromedriver.exe");if(browser.equals("cc")){驱动程序=新的 ChromeDriver();}driver.get(url);回程司机;}//从第一页开始的用户名和继续按钮属性公共无效页面用户名属性(字符串 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();}//第二页的密码和继续按钮属性公共无效页面密码属性(字符串 psd){WebElement 密码=driver.findElement(By.xpath("//input[@id='password']"));WebElement lgn_btn=driver.findElement(By.xpath("//button[contains(@type,'submit')]"));密码.sendKeys(psd);lgn_btn.click();}//一个方法 - isElementExists 来检查该元素是否存在公共布尔 isElementExists(通过 xpath){return driver.findElements(By.xpath("//input[@id='usernameOrEmail']")).size() >0;}/*创建一个方法waitForElement并以秒为单位传递等待时间,这不是硬代码等待,因为它* 将不断检查该元素是否存在,然后等待 1 秒* for循环的每次迭代*/公共布尔waitForElement(int timeInSeconds,通过xpath){尝试{for(int i=0;i
解决方案 这个错误信息...
线程main"org.openqa.selenium.InvalidElementStateException 中的异常:无效元素状态
...表示您尝试与之交互的元素处于无法执行操作的状态.
<小时>无效元素状态异常
以特定间隔(默认 500 毫秒)直到配置的时间量(在您的情况下为 30 秒).一旦 ExpectedConditions 满足.例如,如果在 1 秒内找到所需的元素,则返回它并执行您的下一行代码.不涉及延迟.根据 WebDriverWait 构造函数你总是可以配置 timeOutInSeconds 和 sleepInMillis 即轮询间隔.
<小时>参考
您可以在以下位置找到详细讨论:
- 将隐式等待替换为显式等待 (selenium webdriver & java)
I have read a few online articles and they all point to 1 direction and that is when the page is loading the element is not found. In my setData() you can see I have tried a few things such as use of wait, implicitwait and 1st click and then send the username. However nothing seems to be working. I also thought of using "wait" inside pageProperties but later changed my mind because that would probably be a bad design.
Error :
Exception in thread "main" org.openqa.selenium.InvalidElementStateException: invalid element state
System information: Windows 10, ChromeDriver 2.37.544315, chrome=65.0.3
Code:
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();
}
}
Error:
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:UsersCHQ-SH~1AppDataL...}, 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)
Thank You for your time and suggestion.
Experiment:
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();
}
}
解决方案
This error message...
Exception in thread "main" org.openqa.selenium.InvalidElementStateException: invalid element state
...implies that the element with which you are trying to interact is in a state during which actions cannot be performed.
InvalidElementStateException
InvalidElementStateException is a type of WebDriverException which indicates that a WebElement with whom you are trying to interact is in a state in which actions cannot be performed with it. Such instances may arise when an element is being obscured by another element while clicking or the desired element perhaps is not being visible on the HTML DOM.
Solution
You have to consider a few facts as follows :
- Never mixup implicitlyWait() and WebDriverWait() as the documentation clearly mentions the following :
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.
So you need to remove all the instances of implicitlyWait().
- As you need to send characters to the Email Address or Username field so instead of ExpectedConditions method
visibilityOfElementLocated()
you need to useelementToBeClickable()
method. A simple script to access the url
https://wordpress.com/log-in
and send characters to the Email Address or Username field is as follows :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");
Snapshot of the WebClient :
Update
As per your counter question within your comments the WebDriverWait polls the HTML DOM at certain intervals (default 500 ms) till the configured amount of time (30 seconds in your case). The element/s is/are returned back as soon as the ExpectedConditions is met. For example, if the desired element is found within 1 second, it is returned and your next line of code executes. There is no delay involved. As per the WebDriverWait constructor you can always configure the timeOutInSeconds and sleepInMillis i.e. polling interval.
Reference
You can find a detailed discussion in:
- Replace implicit wait with explicit wait (selenium webdriver & java)
相关文章