Selenium Java - 单击if元素是否存在,如果找不到元素,则继续执行下一个命令

时间:2017-05-27 18:30:21

标签: java selenium automation webdriver

我正在尝试创建一个脚本来测试一个网站(js应用程序),代码几乎完成但我遇到了问题。它应该在网站上编辑问题的脚本(该问题使用了数据库中的大量变量)并且取决于脚本是否失败,或者是否有其他人编辑了问题,脚本有可能获得弹出窗口消息(不是单独的窗口或新选项卡)。我想要代码:

单击元素(如果存在),或者如果元素不存在,则转到下一行代码。

我尝试过使用但没有帮助:

Alert alert = driver.switchTo().alert();
alert.accept();

我的代码:

driver.findElement(By.xpath("//button[2]")).click();                                        
// Click unselect all
Thread.sleep(1000);
driver.findElement(By.linkText("Romania")).click();                                     
// Select Romania
log.debug("Select Romania");
Thread.sleep(2000);
driver.findElement(By.linkText("Germany")).click();                                     
// Select Germany
log.debug("Select Germany");
Thread.sleep(2000);
driver.findElement(By.xpath("//div[4]/a")).click();                                     
// Click Save Button
log.debug("Click Save");
Thread.sleep(3000);

**driver.findElement(By.xpath("//div[4]/div/div/div/div/div/button")).click();**                
// Pop-up message
log.debug("Click Pop-up message");
Thread.sleep(3000);

/////////////// Single Answer

driver.findElement(By.linkText("Change")).click();                                      
// Click Change Template
log.debug("Click Change");
Thread.sleep(2000);

你可以在****(弹出窗口)之间找到问题的行,如果元素存在,我该如何点击或移动到driver.findElement(By.linkText(“Change”))。点击( );如果找不到元素。

如果需要更多信息,请与我们联系。

编辑: 提供有关弹出窗口显示原因的更多详细信息。脚本编辑了一个问题,问题有多个模板,并且在选择模板之后脚本应该通过每个模板,脚本将数据库中的变量与问题相关联。 模板:

单一答案问题 单一答案下拉列表问题 多个回答问题 多个答案下拉列表问题 日期

当模板从多个答案更改为单个答案/日期或相反时,弹出消息显示为警告(将删除使用的变量)。 在完美的情况下,如果脚本成功完成(它将以单个答案下拉结束 - 第一个问题是单个答案,因此弹出窗口不会出现)并且没有人编辑问题我将不会遇到弹出窗口但是如果脚本在将模板更改为多个答案后因x原因而失败,当我重新启动脚本时,我将收到该弹出/警告。

当更改上面代码中显示的问题语言时也会出现问题,我有多个步骤,我遇到了这个问题。

目前为了让脚本运行并避免上述问题,我需要自己编辑问题并在运行脚本之前选择特定的语言和模板。

2 个答案:

答案 0 :(得分:0)

如果未找到匹配的元素,则抛出NoSuchElementException的实例。

try {
    WebElement popUp = driver.findElement(By./**your expression**/);
    popUp.click();  
} catch(NoSuchElementException | StaleElementReferenceException e) {
    log.debug("Impossible to click the pop-up. Reason: " + e.toString());
}

答案 1 :(得分:0)

我建议采用两种方法。

  1. 只需轮询DOM以获取弹出窗口,然后单击按钮(如果存在):

    List<WebElement> button = driver.findElements(By.xpath("//div[4]//button"));
    if (!button.isEmpty()) {
        button.get(0).click();
    }
    ....
    
  2. driver.findElements()用于避免在使用NoSuchElementException

    的情况下尝试捕捉driver.findElement()
    1. 您可以使用显式等待一段时间来显示按钮:

      try{List<WebElement> button = (new WebDriverWait(driver,10)).until(ExpectedConditions.presenceOfElementsLocated(By.xpath("//div[4]//button")));
          if (!button.isEmpty()) {
             button.get(0).click();
          }
      }
      catch(TimeoutException e)
      {
      }