JAVA-Selenium:TimeoutException:预期的条件失败

时间:2018-02-17 14:21:17

标签: java selenium selenium-webdriver

在处理用Java编写的代码以自动点击某个网站上的搜索按钮时,我遇到了一个有趣的问题。

java代码在循环中运行并定位并在每次迭代时单击搜索按钮。这适用于最初的两到三次迭代,但随后代码中断。如果我在执行代码之前手动点击这个web元素(一个按钮),一切都运行良好。

Java中的命令:

WebElement shineWebElementSearchButton = shineWaitLocal.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button[id=id_searchButton]")));
shineWebElementSearchButton.click();
WebElement shineWebElementSearchBoxPopUpField1 = shineWaitLocal.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[id=id_q]")));
shineWebElementSearchBoxPopUpField1.sendKeys("Testing Automation Selenium Qa");

错误:

Exception in thread "main" org.openqa.selenium.TimeoutException: Expected condition failed: waiting for element to be clickable: By.cssSelector: input[id=id_q] (tried for 30 second(s) with 500 MILLISECONDS interval)
Build info: version: '3.6.0', revision: '6fbf3ec767', time: '2017-09-27T16:15:26.402Z'
System info: host: 'ADMIN-PC', ip: '192.168.2.8', os.name: 'Windows 10', os.arch: 'x86', os.version: '10.0', java.version: '1.8.0_161'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{moz:profile=C:\Users\admin\AppData\Local\Temp\rust_mozprofile.tYzdI4bJaghM, rotatable=false, timeouts={implicit=0, pageLoad=300000, script=30000}, pageLoadStrategy=normal, moz:headless=false, platform=XP, moz:accessibilityChecks=false, acceptInsecureCerts=true, browserVersion=57.0, platformVersion=10.0, moz:processID=8664, browserName=firefox, javascriptEnabled=true, platformName=XP, moz:webdriverClick=false}]
Session ID: 89991b7d-9acd-485c-bc59-b537ece2af76
    at org.openqa.selenium.support.ui.WebDriverWait.timeoutException(WebDriverWait.java:82)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:231)
    at autoApplyShine.applyForJobs.applyForJobsFunctionality(applyForJobs.java:32)
    at autoApplyShine.ApplyShine.main(ApplyShine.java:28)

1 个答案:

答案 0 :(得分:1)

您必须按照以下方式处理以下几点:

  • 接下来,当您为 WebElement shineWebElementSearchButton 执行shineWaitLocal时,您正在调用click()方法。因此,您必须使用ExpectedConditions,而不是visibilityOfElementLocated的{​​{3}}条款,而不是:

    shineWaitLocal.until(ExpectedConditions.elementToBeClickable(Locator Strategy)).click();
    

但是,即使等待元素的可见性,您的代码也会生成TimeoutException,这意味着您已调整的elementToBeClickable无法识别 WebElement 唯一。因此,我们必须获得唯一标识元素的Locator Strategy的帮助。

现在,您在代码"button[id=id_searchButton]")和错误堆栈跟踪locator之间明显不匹配>(input[id=id_q]

  • 根据代码中的定位器,它必须是:

    By.cssSelector("button#id_searchButton")
    
  • 根据错误跟踪日志,定位器必须为:

    By.cssSelector("input#id_q")
    
  

注意:从您使用 Selenium Client v3.6.0 的跟踪日志中可以清楚地看到,但令人惊讶的是 版本,这可能使调试变得更加容易,并且可以保留回答您问题的关键:

Driver info: org.openqa.selenium.firefox.FirefoxDriver