【问题标题】:Selenium Java - Click if element exists, continue with the next command if element not foundSelenium Java - 如果元素存在则单击,如果找不到元素则继续下一个命令
【发布时间】:2017-10-28 10:56:18
【问题描述】:

我正在尝试创建一个脚本来测试一个网站(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")).click( );如果找不到元素。

如果需要更多信息,请告诉我。

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

单选题 单答案下拉问题 多选题 多选下拉题 日期

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

如上面代码所示更改问题的语言时也会出现此问题,我有多个步骤遇到此问题。

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

【问题讨论】:

    标签: java selenium automation webdriver


    【解决方案1】:

    如果没有找到匹配的元素,则抛出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());
    }
    

    【讨论】:

    • 我尝试了上面的命令我得到了以下结果: - 如果元素不存在,脚本继续(这是我想要的) - 如果元素存在,单击按钮后会引发异常: org.openqa.selenium.WebDriverException: 未知错误: 元素 ... 在点 (770, 881) 不可点击。其他元素会收到点击: (Session info: chrome=58.0 .3029.110)
    • 也许您访问了错误的元素?通过.isClickable() 电话查看。
    • 问题不在于元素,我需要在尝试后添加等待(因为单击按钮后会有延迟)。感谢您的帮助
    【解决方案2】:

    我推荐两种方法。

    1. 只需轮询弹出窗口的 DOM 并单击按钮(如果存在):

      List<WebElement> button = driver.findElements(By.xpath("//div[4]//button"));
      if (!button.isEmpty()) {
          button.get(0).click();
      }
      ....
      

    driver.findElements() 用于避免在使用driver.findElement() 时尝试捕获NoSuchElementException

    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)
      {
      }
      

    【讨论】:

    • 无需等待,有两种选择:1.按钮出现或2.按钮不出现
    • OP 可能希望使用等待,因为该页面可能被其他用户编辑和更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多