Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定硒中是否存在元素的问题_Java_Selenium - Fatal编程技术网

Java 确定硒中是否存在元素的问题

Java 确定硒中是否存在元素的问题,java,selenium,Java,Selenium,我的程序中有一个if语句,当我被引导到一个页面,要求我在登录过程中输入一个秘密问题的答案时,它应该处理我的反应。如果我被引导到这个页面,它应该填写答案,如果我被引导到密码页面,我的程序应该继续正常运行。为了处理我是否被引导到秘密问题页面,我使用if语句检查该页面上是否存在元素。目前,我正在使用以下工具: if(driver.findElements(By.className("answer")).size() == 0){ WebDriverWait pageLoadWait1 = ne

我的程序中有一个if语句,当我被引导到一个页面,要求我在登录过程中输入一个秘密问题的答案时,它应该处理我的反应。如果我被引导到这个页面,它应该填写答案,如果我被引导到密码页面,我的程序应该继续正常运行。为了处理我是否被引导到秘密问题页面,我使用if语句检查该页面上是否存在元素。目前,我正在使用以下工具:

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。在
    返回您正在等待的元素之前,无需再次查找它