Java 确定硒中是否存在元素的问题
我的程序中有一个if语句,当我被引导到一个页面,要求我在登录过程中输入一个秘密问题的答案时,它应该处理我的反应。如果我被引导到这个页面,它应该填写答案,如果我被引导到密码页面,我的程序应该继续正常运行。为了处理我是否被引导到秘密问题页面,我使用if语句检查该页面上是否存在元素。目前,我正在使用以下工具:Java 确定硒中是否存在元素的问题,java,selenium,Java,Selenium,我的程序中有一个if语句,当我被引导到一个页面,要求我在登录过程中输入一个秘密问题的答案时,它应该处理我的反应。如果我被引导到这个页面,它应该填写答案,如果我被引导到密码页面,我的程序应该继续正常运行。为了处理我是否被引导到秘密问题页面,我使用if语句检查该页面上是否存在元素。目前,我正在使用以下工具: if(driver.findElements(By.className("answer")).size() == 0){ WebDriverWait pageLoadWait1 = ne
if(driver.findElements(By.className("answer")).size() == 0){
WebDriverWait pageLoadWait1 = new WebDriverWait(driver, 10);//wait for 10 sec.
WebElement element1 = pageLoadWait1.until(ExpectedConditions.elementToBeClickable(By.name("answer")));
WebElement answer = driver.findElement(By.name("answer"));
answer.sendKeys(security);
answer.sendKeys(Keys.ENTER);
}
我遇到的问题是,当我没有重定向到一个秘密页面,而只是转到密码页面时,它仍然在寻找答案
类名,而类名并不存在
我还使用了
.isDisplayed()
,得到了类似的结果,这让我觉得这与if语句背后的逻辑有关,但是,程序仍然在寻找answer
,即使它不存在,这一事实让我认为这与我检查元素存在的方式有关。您发布的代码段中的第一条if
语句将检查类为answer
的元素,如果不存在则将检查该元素检查名称为answer
的元素。我认为这应该是相反的。我对代码进行了一些改进
Selenium将检查您是否设置了任何隐式等待。如果您设置了隐式等待(比如10秒),driver.findElements
将每隔500毫秒查找一次元素,直到10秒。如果10秒后未找到元素,则返回0
在下面的代码中,我假设您没有设置任何隐式等待
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
// wait for 10 seconds to see if the secret page has loaded.
int retryCount = 0;
boolean secretPageLoaded = false;
while (retryCount++ < 10) {
if (driver.findElements(By.className("answer")).size()!=0) {
secretPageLoaded = true;
break;
}
Thread.sleep(1000);
}
if(secretPageLoaded){
WebDriverWait pageLoadWait1 = new WebDriverWait(driver, 10);//wait for 10 sec.
WebElement answer = pageLoadWait1.until(ExpectedConditions.elementToBeClickable(By.name("answer")));
// You can remove the below line as the element will be returned in the above statement
//WebElement answer = driver.findElement(By.name("answer"));
answer.sendKeys(security);
answer.sendKeys(Keys.ENTER);
driver.manage().timeouts().implicitlyWait(0,TimeUnit.SECONDS);
//等待10秒钟,查看是否已加载机密页面。
int retryCount=0;
布尔secretpageload=false;
while(retryCount++<10){
if(driver.findElements(By.className(“answer”)).size()!=0){
secretpageload=true;
打破
}
睡眠(1000);
}
如果(已加载secretPageLoaded){
WebDriverWait pageLoadWait1=新的WebDriverWait(驱动程序,10);//等待10秒。
WebElement answer=pageLoadWait1.until(ExpectedConditions.ElementToBickable(By.name(“answer”));
//您可以删除下面的行,因为元素将在上面的语句中返回
//WebElement-answer=driver.findElement(By.name(“answer”);
回答:发送密钥(安全);
应答。发送键(键。输入);
}当您使用
findelelements(By.className(“answer”)).size()
告诉驱动程序查找类名为“answer”的元素时,驱动程序无法“知道”没有这样的元素。您可以尝试使用try catch
block
try {
WebDriverWait pageLoadWait1 = new WebDriverWait(driver, 10);
WebElement answer = pageLoadWait1.until(ExpectedConditions.visibilityOfElementLocated(By.name("answer")));
answer.sendKeys(security);
answer.sendKeys(Keys.ENTER);
}
catch (TimeoutException) {
// do something if you like
}
// continue...
如果pageLoadWait1。在找到元素之前,他将继续sendKeys
。如果没有,代码将直接进入捕获(类似于If-else
)
两个音符
WebDriverWait pageLoadWait1=新的WebDriverWait(驱动程序,10)代码>意味着
驾驶员正在等待上升至10秒,等待
ExpectedConditions
为真,如果
条件为真(您的评论有误?)
pageLoadWait1。在
返回您正在等待的元素之前,无需再次查找它李>