Selenium Java-如果元素存在,请单击;如果元素未找到,请继续执行下一个命令

Selenium Java-如果元素存在,请单击;如果元素未找到,请继续执行下一个命令,java,selenium,automation,webdriver,Java,Selenium,Automation,Webdriver,我正在尝试创建一个脚本来测试一个网站(js应用程序),代码几乎完成了,但我遇到了一个问题。脚本应该在网站上编辑一个问题(该问题使用了数据库中的许多变量),并且取决于脚本是否失败或者是否有其他人编辑了该问题,脚本有可能获得弹出消息(而不是单独的窗口或新选项卡)。我希望代码: 如果元素存在,请单击该元素;如果元素不存在,请转到下一行代码 我尝试使用,但没有帮助: Alert alert = driver.switchTo().alert(); alert.accept(); 我的代码: drive

我正在尝试创建一个脚本来测试一个网站(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(“更改”)。单击();如果未找到元素

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

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

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

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

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


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

如果没有找到匹配的元素,则会抛出一个
NoTouchElementException
的实例

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());
}

我推荐两种方法

  • 只需轮询DOM以获得弹出窗口,并单击按钮(如果存在):

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

  • 不需要等待,只有以下选项:1。此时会出现按钮或2。按钮不出现。由于页面可能被其他用户编辑和更改,P可能希望使用wait。我尝试了上述命令,结果如下:-如果元素不存在,脚本将继续(这是我想要的)-如果元素存在,单击按钮后引发异常:org.openqa.selenium.WebDriverException:未知错误:元素。。。在点(770881)处不可单击。其他元素将收到单击:。。。(会话信息:chrome=58.0.3029.110)可能您访问了错误的元素?使用
    .isClickable()
    调用检查它。问题不在于元素,我需要在尝试后添加等待(因为单击按钮后会有延迟)。谢谢你的帮助
    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)
    {
    }