Java 中机器人框架 "Wait Until Page Contains" 的等效 ExpectedCondition 是什么
What is the equivalent ExpectedCondition of "Wait Until Page Contains" of robot framework in Java
我知道 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
关键字?
类似功能还有很多,不过这三个用的最多..
Wait Until Element Is Enabled
假定该元素存在于页面上,并将等待该元素被启用(不是只读的,也不是禁用的)。如果该元素不存在,它将立即失败(或者如果您有隐式等待,则在超时后失败)
Wait Until Element is Visible
假定该元素存在于页面上,并将等待该元素可见。如果该元素不存在,它将立即失败(或者如果您有隐式等待,则在超时后失败)
Wait Until Page Contains Element
不对元素做任何假设。它一直等到元素实际出现在页面上,而不管它是可见的、不可见的、启用的还是禁用的。它不需要隐式等待,因为此关键字是显式等待。
最完整的解决办法就是等它出现在页面上,等它可见,再等它被启用。
如果该元素将始终在页面上,您可以跳过第一次检查(即:如果没有 javascript
可以创建或删除该元素)。
如果该元素将始终启用,则无需等待它启用(即:如果没有 javascript
来禁用或启用该元素)
对于简单的静态页面,您实际上只需要检查元素是否可见。即使这样通常也不是必需的,因为 selenium 在页面加载之前不会 return 从打开页面开始。当页面是动态的时,问题就来了。也就是说,当有 javascript
可以更改页面上的内容以及它是否可见或启用时,在 html 加载后。
不,因为 "is loaded" 在不同的应用程序中可能有不同的含义。浏览器在完成加载 html 后会将变量 document.readyState
设置为“complete
”。您可以使用 Wait for condition return window.document.readyState === 'complete'
之类的东西在机器人中检查它。同样,如果您有 javascript
在页面上运行,这可能还不够,因为页面可能会在初始 HTML
加载后发生变化。
没有直接模拟,这是在 Robot Framework 中明确开发的功能。
同时,您可以使用 ExpectedCondition 的 presenceOfElementLocated() 和 explicit/fluent 等待来实现它(顺便说一句,后者只是第一个的更可定制的版本)。
对于定位器,使用此 xpath:
//*[contains(., "Your Text Here")]
这就是Robotf Framework actually does,我必须承认非常聪明。
等到页面包含
Wait Until Page Contains is the implementation to wait for the text
to appear within the 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 可以是以下之一:
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 Tree,ExpectedConditions
基于 当前页面 上的 WebElements,这使得您的 Tests 更细化。
我知道 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
关键字?
类似功能还有很多,不过这三个用的最多..
Wait Until Element Is Enabled
假定该元素存在于页面上,并将等待该元素被启用(不是只读的,也不是禁用的)。如果该元素不存在,它将立即失败(或者如果您有隐式等待,则在超时后失败)
Wait Until Element is Visible
假定该元素存在于页面上,并将等待该元素可见。如果该元素不存在,它将立即失败(或者如果您有隐式等待,则在超时后失败)
Wait Until Page Contains Element
不对元素做任何假设。它一直等到元素实际出现在页面上,而不管它是可见的、不可见的、启用的还是禁用的。它不需要隐式等待,因为此关键字是显式等待。
最完整的解决办法就是等它出现在页面上,等它可见,再等它被启用。
如果该元素将始终在页面上,您可以跳过第一次检查(即:如果没有 javascript
可以创建或删除该元素)。
如果该元素将始终启用,则无需等待它启用(即:如果没有 javascript
来禁用或启用该元素)
对于简单的静态页面,您实际上只需要检查元素是否可见。即使这样通常也不是必需的,因为 selenium 在页面加载之前不会 return 从打开页面开始。当页面是动态的时,问题就来了。也就是说,当有 javascript
可以更改页面上的内容以及它是否可见或启用时,在 html 加载后。
不,因为 "is loaded" 在不同的应用程序中可能有不同的含义。浏览器在完成加载 html 后会将变量 document.readyState
设置为“complete
”。您可以使用 Wait for condition return window.document.readyState === 'complete'
之类的东西在机器人中检查它。同样,如果您有 javascript
在页面上运行,这可能还不够,因为页面可能会在初始 HTML
加载后发生变化。
没有直接模拟,这是在 Robot Framework 中明确开发的功能。
同时,您可以使用 ExpectedCondition 的 presenceOfElementLocated() 和 explicit/fluent 等待来实现它(顺便说一句,后者只是第一个的更可定制的版本)。
对于定位器,使用此 xpath:
//*[contains(., "Your Text Here")]
这就是Robotf Framework actually does,我必须承认非常聪明。
等到页面包含
Wait Until Page Contains is the implementation to wait for the text
to appear within the 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 可以是以下之一:
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 Tree,ExpectedConditions
基于 当前页面 上的 WebElements,这使得您的 Tests 更细化。