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

时间:2016-01-19 01:49:24

标签: java selenium

我的程序中有一个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);       
}

我遇到的问题是,当我没有被重定向到秘密页面,而只是重定向到密码页面时,它仍然在寻找answer类名称,不存在。

我还使用了.isDisplayed(),并收到了类似的结果,这让我觉得它与if语句背后的逻辑有关,但事实上该程序仍然在寻找{{ 1}}即使它不存在也让我认为它与我检查元素存在的方式有关。

2 个答案:

答案 0 :(得分:1)

您发布的代码段中的第一个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);       

}

答案 1 :(得分:1)

当您使用fork时,您告诉司机要查找带有班级名称的元素&#34;回答&#34;,司机无法知道&#39;没有这样的元素。您可以尝试使用findElements(By.className("answer")).size()阻止

try catch

如果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.until。如果它没有,代码将直接进入捕获(sendKeys种类。)

两个笔记

  1. if else表示 司机正在等待向上到10秒钟 WebDriverWait pageLoadWait1 = new WebDriverWait(driver, 10);如果是真的,它可能根本不会等待 条件为真(您的评论是错字?)。
  2. ExpectedConditions返回您正在等待的元素,无需再次查找。