我读过一些在线文章,它们都指向一个方向,即当页面加载元素时,找不到元素。在my setData()中,您可以看到我尝试了一些方法,例如使用wait、implicitwait和第一次单击然后发送用户名。然而,一切似乎都不起作用。我还想过在pageProperties中使用“wait”,但后来改变了主意,因为这可能是一个糟糕的设计。
错误:
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();
}
}
如果您的应用程序正在处理JQuery,则可以处理此问题。这段代码将等待,直到您的页面完全加载了所有必需的数据,并将避免无效的元素状态异常。
线程“main”组织中出现异常。openqa。硒。InvalidElementState异常:元素状态无效
public static boolean waitForJSandJQueryToLoad() {
WebDriverWait wait = new WebDriverWait(getWebDriver(), 30);
// wait for jQuery to load
ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
try {
System.out.println(
"Request = " + ((JavascriptExecutor) driver).executeScript("return jQuery.active"));
return ((Long) ((JavascriptExecutor) driver).executeScript("return jQuery.active") == 0);
} catch (Exception e) {
// no jQuery present
System.out.println("no jQuery present");
return true;
}
}
};
// wait for Java script to load
ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
try {
System.out.println(
"Request = " + ((JavascriptExecutor) driver).executeScript("return document.readyState").toString());
return ((JavascriptExecutor) driver).executeScript("return document.readyState").toString().equals("complete");
} catch (Exception e) {
// no jQuery present
System.out.println("no jQuery present");
return true;
}
}
};
return wait.until(jQueryLoad) && wait.until(jsLoad);
}
为了使其一致,请遵循以下步骤:
A) 创建一个方法-isElementExists来检查该元素是否存在,如下所示:
public boolean isElementExists(String xpathOfElement){
return driver.findElements(By.xpath(xpathOfElement)).size() > 0;
}
B) 现在创建一个waitForElement方法并将等待时间(以秒为单位)传递给它,这不是硬代码等待,因为它将持续检查该元素是否存在,然后在for循环的每次迭代中等待1秒,如下所示:
public boolean waitForElement(int timeInSeconds, String xpathOfElement){
try{
for(int i=0;i<timeInSeconds;i++){
if(isElementExists(xpathOfElement))
return true;
Thread.sleep(1000);
}
}catch(Exception ex){
ex.printStackTrace();
}
return false;
}
C) 因此,一旦它返回true,您就可以对该元素执行操作。
我已经使用xpath来定位元素,您可以使用任何您想要的。
此错误消息。。。
Exception in thread "main" org.openqa.selenium.InvalidElementStateException: invalid element state
...表示您尝试与之交互的元素处于无法执行操作的状态。
InvalidElementStateExcture是一种WebDriverExcture,它指示您试图与之交互的WebElement处于无法使用它执行操作的状态。当一个元素在单击时被另一个元素遮挡,或者所需的元素在超文本标记语言DOM上不可见时,可能会出现这种情况。
你必须考虑以下几个事实:
不要混合隐式和显式等待。这样做会导致不可预测的等待时间。例如,将隐式等待设置为10秒,显式等待设置为15秒,可能会导致20秒后出现超时。
因此,您需要删除隐式wait()的所有实例。
>
elementToBeClickable()
方法,而不是预期条件方法。 访问urlhttps://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会以一定的间隔(默认为500毫秒)轮询HTML DOM,直到达到配置的时间量(在您的情况下为30秒)。一旦满足预期条件,元素就会返回。例如,如果在1秒内找到所需的元素,则返回该元素并执行下一行代码。没有延误。根据WebDriverWait构造函数,您始终可以配置timeOutInSeconds和sleepInMillis,即轮询间隔。
有关详细讨论,请参见:
我尝试使用selenium测试登录功能,但我得到了这个例外: 这是我的代码: 注意:我尝试使用和xpath,但仍然不起作用。我也尝试在本文中使用一些解决方案,但没有结果 这是Html页面使用框架的菜单和其他表单登录页面 SCT公司 :
我不得不重新测试,以前它工作正常,但现在它给我一个错误。 我也尝试了不同的定位器,比如id、name。但仍然会得到相同的错误。
如何解决陈旧的元素异常我已经尝试了web驱动程序等待和尝试n捕捉,但仍然得到相同的。它也是点击按钮,我试图点击一个表,也导航到下一页。 这是相同的代码:
运行代码后,我得到以下错误:线程“main”org . open QA . selenium . invalidargumentexception中的异常:无效参数(会话信息:chrome=103.0.5060.114)构建信息:版本:“4.3.0”,修订版:“a4995e2c09*”系统信息:主机:“SADAF-RAUF”,IP:“192 . 168 . 1 . 55”,OS . name:“W
问题内容: 我的任务是编写一个解析器以单击网站上的一个按钮,但我只能单击其中一个按钮而遇到问题。以下代码适用于除一个按钮之外的所有按钮。 这是html:http: //pastebin.com/6dLF5ru8 这是源html:http: //pastebin.com/XhsedGLb python代码: 我收到此错误。 根据赛富尔,我刚刚尝试等待相同的元素不可见异常: 问题答案: 如果你看一下页
希望有人能帮助我。我有下面的代码,我得到了抛出的异常:“OpenQA。硒。StaleElementReferenceException' 我在这段代码中遇到了一个异常,即:WeekDaysResults=Days。文本 错误: OpenQA。硒。StaleElementReferenceException:“StaleElement引用:元素未附加到页面文档 我尝试了一个试抓块,但不起作用。提前感