如何在Selenium web Driver中写入等待,直到值填充下拉,然后单击按钮

时间:2014-02-25 03:48:49

标签: java selenium

在我的应用程序中打开页面时,会显示一个下拉列表,然后我需要单击“继续”按钮。问题是下拉需要一些时间来加载值,但在我的代码中,它在下拉加载之前单击。我尝试使用隐式wait和thread.sleep但它有时候它工作,有些时候不起作用。 代码:

       public class Home {

    public static void main(String[] args) throws IOException, InterruptedException 
    {
    File file1 = new File("C:\\Selenium\\IEDriverServer_Win32_2.35.3\\IEDriverServer.exe");
      System.setProperty("webdriver.ie.driver", file1.getAbsolutePath());

   WebDriver driver = new InternetExplorerDriver();
    driver.get("http://10.120.13.100/");

     driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);

    Thread.sleep(3000);

    WebElement clickBtn = driver.findElement(By.id("btnHomeProceed"));
   clickBtn.click(); 

6 个答案:

答案 0 :(得分:5)

您可以使用FluentWait

final Select droplist = new Select(driver.findElement(By.Id("selection")));
new FluentWait<WebDriver>(driver)
        .withTimeout(60, TimeUnit.SECONDS)
        .pollingEvery(10, TimeUnit.MILLISECONDS)
        .until(new Predicate<WebDriver>() {

            public boolean apply(WebDriver d) {
                return (!droplist.getOptions().isEmpty());
            }
        });

答案 1 :(得分:1)

前一段时间我遇到了同样的问题。这是我使用Java 8的解决方案:

    void selectTextFromDropDown(final By locator, final String value, final int timeoutInSeconds) {
    FluentWait<WebDriver> wait = createWait(timeoutInSeconds);
    wait.until(input -> {
        Select mySelect = new Select(input.findElement(locator));
        List<WebElement> options = mySelect.getOptions();
        for (WebElement option : options) {
            if (option.getText().equalsIgnoreCase(value)) {
                option.click();
                mySelect.getAllSelectedOptions().contains(value.toLowerCase());
                break;
            }
        }
        return true;
    });
}

答案 2 :(得分:1)

使用正确的X.path进入选项可以很容易解决。尝试以下代码。

WebDriverWait wait = new WebDriverWait(driver, 30); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//select[@name='Location']/option[@value='1']")));

这将查看option中的元素是否已加载,如果未加载,它将等待直到在给定的几秒钟内将其加载到DOM中。

答案 3 :(得分:0)

您应该使用wait()notify()方法。 您编写Thread.sleep()方法的地方,将其替换为this.wait()。 您完成下拉列表的加载数据的地方放置了this.notify()方法。 我希望这会对你有所帮助。

答案 4 :(得分:0)

这样的事情应该做你想做的事。

for (int second = 0;; second++) {
    if (second >= 60) fail("timeout");
    try { 
        Select droplist = new Select(driver.findElement(By.Id("selection")));
        if(!droplist.getOptions().isEmpty()){
            break;
        }
    } catch (Exception e) {
         // best put something here
    }
    Thread.sleep(1000);
}

答案 5 :(得分:0)

您可以使用以下内容:

//To type text in drop down 
driver.findElement(By.id("ur id")).sendKeys("txt");

//Use implicit wait to load the drop down
driver.manage().timeouts().implicitlyWait(250, TimeUnit.MILLISECONDS)

//Then click on the value in the drop down
new WebDriverWait(driver,30).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//li[@class='ui-menu-item'][5]"))).click()

//Now click the next drop down after clicking the drop down value
driver.findElement(By.className("buttonname")).click()