1

我需要在测试期间检查我的网站是否有无效的工具提示和其他错误消息,以确保一切正常。问题是 selenium 似乎要花很长时间才能找到这些元素,并且它们被设置在一个计时器上,所以它们有时有时间在 selenium 找到它们之前消失,我们正在谈论一个 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;}

尽管如此,它似乎并没有更快地验证元素的存在。

4

1 回答 1

0

我在我曾经构建的每一个框架中都放入了一些东西,这非常有效。这是从这里找到的框架的摘录。你可以在这里下载...

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

这些是来自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);
    }

自己结合这些方法,你就可以开始了。

在性能方面,我不能对你强调这一点。使用 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']

路径:

//div[@id='something']/div[contains(@class, 'someClass')]/a[starts-with(@href, 'http://google')]
于 2013-10-09T02:54:45.167 回答