Java中的机器人框架的“等待页面包含”的等效条件是什么?

时间:2019-02-14 05:50:55

标签: java selenium robotframework webdriverwait selenium2library

我知道Java中有多种等待类型

隐性等待-

driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS)

明确等待-

WebDriverWait wait = new WebDriverWait(driver, explicitWaitSec);
        wait.until(ExpectedConditions.elementToBeClickable(element));

流利等待-

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)                            
        .withTimeout(30, TimeUnit.SECONDS)          
        .pollingEvery(5, TimeUnit.SECONDS)          
        .ignoring(NoSuchElementException.class);

,但是我感到困惑的是,哪种等待和期望条件将最接近Robot Framework中的Wait Until Page Contains关键字?

3 个答案:

答案 0 :(得分:2)

没有直接的模拟,这是在Robot Framework中明确开发的功能。
同时,您可以使用ExpectedCondition的presenceOfElementLocated()进行显式/流畅的等待(后者只是第一个的可定制版本,btw)。

对于定位器,请使用以下xpath:

//*[contains(., "Your Text Here")]

这是Robotf Framework actually does,我必须承认,这很聪明。

答案 1 :(得分:1)

等待页面包含

Wait Until Page Contains wait 等待text出现在HTML DOM中的实现。它记录为:

Keyword                     Arguments                           Documentation
-------                     ---------                           -------------
Wait Until Page Contains    text, timeout=None, error=None      Waits until text appears on current page.
                                                                Fails if timeout expires before the text appears. See the Timeouts section for more information about using timeouts and their default value.
                                                                error can be used to override the default error message.

源代码:

@keyword
def wait_until_page_contains(self, text, timeout=None, error=None):
    """Waits until ``text`` appears on current page.
    Fails if ``timeout`` expires before the text appears. See
    the `Timeouts` section for more information about using timeouts
    and their default value.
    ``error`` can be used to override the default error message.
    """
    self._wait_until(lambda: self.is_text_present(text),
                     "Text '%s' did not appear in <TIMEOUT>." % text,
                     timeout, error)

因此等效的ExpectedConditions可以是以下任意一项:

注意:一个明显的不同是,wait_until_page_contains当前页面相关,即当前DOM Tree,{{1} }基于当前页面上的 WebElements ,这使您的测试更加精细。

答案 2 :(得分:0)

有更多类似的功能,但是这三个功能最多。

Wait Until Element Is Enabled假定该元素存在于页面上,并且将等待直到该元素被启用(非只读且未被禁用)。如果该元素不存在,它将立即失败(或在超时后,如果您有隐式等待)

Wait Until Element is Visible假定该元素存在于页面上,并将等待直到该元素可见。如果该元素不存在,它将立即失败(或在超时后,如果您有隐式等待)

Wait Until Page Contains Element不对该元素做任何假设。它等待直到元素实际在页面上,无论它是可见,不可见,启用还是禁用。不需要隐式等待,因为此关键字是显式等待。

最完整的解决方案是等待它出现在页面上,等待它可见,然后等待它启用。

如果该元素始终位于页面上,则可以跳过第一个检查(即:是否没有javascript可以创建或删除该元素)。

如果将始终启用该元素,则无需等待其启用(即:如果没有javascript可以禁用或启用该元素)

对于简单的静态页面,实际上只需要检查一个元素是否可见。甚至这通常不是必需的,因为硒不会在打开页面之前从打开页面返回。当页面是动态的时,问题就来了。也就是说,加载HTML之后,javascript可以更改页面上的内容以及该页面的可见或启用状态。

否,因为“加载”在不同的应用程序中可能具有不同的含义。完成加载html后,浏览器会将变量document.readyState设置为“ complete”。您可以使用诸如等待条件return window.document.readyState === 'complete'之类的方法在机械手中进行检查。同样,如果您有javascript在该页面上运行,这可能还不够,因为在初始HTML加载后页面可能会更改。