0

运行 Selenium Webdriver 测试时,我遇到了非常奇怪的问题。

我的代码

driver.findElement(By.id("id")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.className("green_true")).click();

这些元素实际上是存在的。我什至可以看到有问题的 url 被 webdriver 点击了,但是没有任何反应。浏览器不会进入该页面,也不会找到 green_true 元素。导致错误。但只是偶尔。有时测试运行正常。

谁能告诉这怎么可能?

我不能使用确切的网址,因为它们因所选语言而异。

4

2 回答 2

0

单击动态元素时尝试使用显式等待。等到元素出现在 Web 浏览器上或对它们应用操作。您可以使用此模式:

final FluentWait<WebDriver> wait =
            new FluentWait<WebDriver>(getDriver())
                    .withTimeout(MASK_PRESENCE_TIMEOUT, TimeUnit.SECONDS)
                    .pollingEvery(100, TimeUnit.MILLISECONDS)
                    .ignoring(NoSuchElementException.class)
                    .ignoring(StaleElementReferenceException.class)
                    .withMessage("Time out while waiting the element is loaded");

    wait.until(new Predicate<WebDriver>() {

        @Override
        public boolean apply(final WebDriver driver) {
            return ! driver.findElements(By.id("id")).isEmpty(); 
        }

    });
于 2012-10-16T10:35:23.137 回答
0

出色地。建议按以下方式修改:而不是

driver.findElement(By.id("id")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.className("green_true")).click();

尝试使用以下:

public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                }
                }
);
                           return  foo;              }     ;

fluentWait(By.id("id")).click();
fluentWait(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
fluentWait(By.className("green_true")).click();

问题可能是您在与元素交互(单击等)后在页面上获得了一些 AJAX。恕我直言,我们需要使用更强大的等待机制。

一条建议:当您获得 webelement 或 css 选择器的 xpath 时,不要忘记验证在 fireBug、ffox 扩展中找到的定位器。 定位器验证 问候。

于 2012-10-16T09:32:02.227 回答