Java中机器人框架"Wait Until Page Contains"的等效预期条件是什么



我知道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);

,但我感到困惑的是,哪些等待和预期条件将最接近机器人框架中的Wait Until Page Contains关键字?

没有直接的模拟,这是在机器人框架中明确开发的功能。
同时,你可以用 ExpectCondition 的 presenceOfElementTLocation() 和显式/流畅的等待来实现它(后者只是第一个的更可定制的版本,顺便说一句)。

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

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

这就是Robotf Framework实际上所做的,我必须承认非常聪明。

等到页面包含

"等到页面包含"是等待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)

因此,等效的预期条件可以是以下任一条件:

  • textToBePresentInElement(WebElement element, java.lang.String text):检查给定文本是否存在于指定元素中的期望。
  • textToBePresentInElementLocated(By locator, java.lang.String text):检查给定文本是否存在于与给定定位器匹配的元素中的期望。
  • textToBePresentInElementValue(By locator, java.lang.String text):检查给定文本是否存在于指定元素值属性中的期望。
  • textToBePresentInElementValue(WebElement element, java.lang.String text):检查给定文本是否存在于指定元素值属性中的期望。

注意:一个显着的区别是,虽然wait_until_page_contains是相对于当前页面(即当前 DOM 树)的,但ExpectedConditions基于当前页面上WebElements,这使得您的测试更加精细。

还有更多的函数,但这三个主要使用。

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

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

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

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

如果元素始终在页面上,则可以跳过第一次检查(即:如果没有可以创建或删除元素的javascript)。

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

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

否,因为"已加载"在不同的应用程序中可能意味着不同的东西。浏览器将在加载完 html 后将变量document.readyState设置为"complete"。您可以在机器人中使用类似的东西来检查 等待条件return window.document.readyState === 'complete'.同样,如果您有在页面上运行的javascript,这可能还不够,因为页面可能会在加载初始HTML后更改。

最新更新