【问题标题】:Is it worth to use Selenium com.thoughtworks.selenium.Wait class for waiting? (Performance)使用 Selenium com.thoughtworks.selenium.Wait 类等待是否值得? (表现)
【发布时间】:2011-03-09 23:21:47
【问题描述】:

为了方便起见,Selenium 具有 com.thoughtworks.selenium.Wait 类。我在下一个方式使用它:

public void waitForElement(final String locator){
    Wait a = new Wait(){
        @Override public boolean until(){
             selenium.isElementPresent(locator);
        }
    }

    a.wait("Cannot found locator " + locator, TIMEOUT);
}

据我所知,每次调用我的函数时,都会创建新的匿名类,然后创建此类的对象。还是只创建一个匿名类?

无论如何。直接在 waitForElement 方法中使用 Thread.sleep() 然后每次创建新对象有多快?这种差异有多大?

【问题讨论】:

  • @djangofan 我的问题提前了半年!!!
  • @djangofan 而且,你不觉得它们是完全不同的问题吗?

标签: java selenium wait


【解决方案1】:

确切地说,匿名类只创建一次(在编译期间)并且只加载一次。

每次调用该方法时都会实例化,但开销非常小。

如果您经常这样做,那么您可以轻松创建一个(非匿名)类:

public class ElementPresenceWait extends Wait {
    private final String locator;

    public ElementPresenceWait(final String locator) {
        this.locator=locator;
    }

    @Override public boolean until(){
        selenium.isElementPresent(locator);
    }

    public void wait(long timeoutInMilliseconds) {
        wait("Cannot found locator " + locator, timeoutInMilliseconds);
    }
}

那么你可以做的更简单

new ElementPresenceWait("foo").wait(1000);

【讨论】:

  • 谢谢。这是方法。我什至可以为定位器属性创建设置器,所以我什至不应该每次都创建新实例,只需更改定位器属性
  • @nahab:你可以,但我不会那样做。创建对象的开销非常非常小(尤其是当您的程序准备等待 1000 毫秒时)并且拥有不可变对象只会使大量问题变得不可能。
【解决方案2】:

我敢说差异很小,您应该使用使代码更具可读性的东西。在我个人看来,使用 Wait 类更具可读性。

【讨论】:

  • 我同意。我会使用标准的 Wait、WebDriverWait 或父类 FluentWait。
【解决方案3】:

我不熟悉 com.thoughtworks.selenium.Wait 的内部实现,但是通常我更喜欢编写“智能等待”,它首先检查,然后休眠 1/4 秒,然后再次检查,然后休眠并以此类推,直到达到最大超时。

这允许在等待某些东西时比线程更快地执行。Sleep 必须始终等待最大睡眠时间。

【讨论】:

  • 这些“智能等待”很棒,并且通常可以正常工作,但我发现在少数情况下脚本倾向于“跑赢”浏览器,(没有给 javascript 加载时间例如)并且没有检测过渡的好方法。
  • 嗯。 Internet Explorer 公开了 readystate 属性来判断它何时加载,如果 AJAX 需要,它与 javascript 注入相结合对我有用。事实上,我不记得什么时候没有。 (但这并不意味着它总是 100% 有效)
猜你喜欢
  • 2014-05-27
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2019-10-19
  • 2017-06-09
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
相关资源
最近更新 更多