找到元素selenium + java的最快方法

时间:2013-10-08 18:43:31

标签: java performance selenium elements

我需要在测试期间检查我的网站上的无效工具提示和我网站上的其他错误消息,以确保一切都很好。问题是,硒似乎需要永远找到这些元素,并且它们被设置在计时器上,因此它们有时会在硒发现它们之前有时间消失,我们正在讨论3秒计时器。

现在我发现它们是这样的:

      List<WebElement> error = driver.findElements(By.cssSelector("div.alert .error"));
        if (error.size() == 0) {return true;}
        else {return false;}

这将找到在给定时间在网站上显示的所有错误消息,这有时会缓慢跟上。使用javascript创建和销毁工具提示,这样它们就不会被隐藏然后显示出来。有什么想法吗?

编辑:

由于网站是单页的,所以要找到合适的网页需要大量的元素,当我找到一个实际上可以销售的项目时它很快,以便最大限度地减少我的搜索,我这样做了:

WebElement messages = driver.findElement(By.id("the-div-the-message-is-created-in"));
List<WebElement> error = messages.findElements(By.cssSelector("div.alert .error"));
if (error.size() == 0) {return true;}
else {return false;}

虽然它似乎没有更快地验证元素的存在。

1 个答案:

答案 0 :(得分:0)

我在我构建的每个框架中都放置了一些东西,这非常有效。这里是here框架的一个例外。 You can download it here ...

在对对象执行任何操作之前,我实现了一种伪等待类型方法。亲自尝试一下。这非常有效。

这些是来自AutomationTest

的方法
    /**
     * Checks if the element is present or not.<br>
     * @param by
     * @return <i>this method is not meant to be used fluently.</i><br><br.
     * Returns <code>true</code> if the element is present. and <code>false</code> if it's not.
     */
    public boolean isPresent(By by) {
        if (driver.findElements(by).size() > 0) return true;
        return false;
    }

    /**
     * Private method that acts as an arbiter of implicit timeouts of sorts.. sort of like a Wait For Ajax method.
     */
    private WebElement waitForElement(By by) {
        int attempts = 0;
        int size = driver.findElements(by).size();

        while (size == 0) {
            size = driver.findElements(by).size();
            if (attempts == MAX_ATTEMPTS) fail(String.format("Could not find %s after %d seconds",
                                                             by.toString(),
                                                             MAX_ATTEMPTS));
            attempts++;
            try {
                Thread.sleep(1000); // sleep for 1 second.
            } catch (Exception x) {
                fail("Failed due to an exception during Thread.sleep!");
                x.printStackTrace();
            }
        }

        if (size > 0) System.err.println("WARN: There are more than 1 " + by.toString() + " 's!");

        return driver.findElement(by);
    }

自己结合使用这些方法,你就可以了。

ALSO

就性能而言,我不能向你强调这一点。使用CSS 。它更快,更清洁。亲眼看看。

考虑以下内容,

<div id="something">
  <div class="someClass">
    <a href='http://google.com/search?'>Search Google</a>
  </div>
</div>

让我们找到<a>

CSS:

div#something div.someClass > a[href^='http://google']

XPATH:

//div[@id='something']/div[contains(@class, 'someClass')]/a[starts-with(@href, 'http://google')]