- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看过几篇在线文章,它们都指向 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
...表示您尝试与之交互的元素处于无法执行操作的状态。
InvalidElementStateException是 WebDriverException 的一种这表示您尝试与之交互的 WebElement 处于无法对其执行操作的状态。当一个元素在单击时被另一个元素遮挡或所需元素可能在 HTML DOM 上不可见时,可能会出现此类情况。 .
您必须考虑以下几个事实:
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() 实例。
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 的快照:
根据您评论中的反问,WebDriverWait 轮询 HTML DOM以一定的时间间隔(默认 500 毫秒)直到配置的时间量(在您的情况下为 30 秒)。一旦 ExpectedConditions 返回元素。被满足。例如,如果在 1 秒内找到所需的元素,则返回它并执行下一行代码。不涉及延迟。根据 WebDriverWait构造函数,您始终可以配置 timeOutInSeconds 和 sleepInMillis,即轮询间隔。
您可以在以下位置找到详细讨论:
关于java - Selenium : How to solve org. openqa.selenium.InvalidElementStateException: 无效元素状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49902198/
我是一名优秀的程序员,十分优秀!