如何使用 Selenium 和 Java 通过 PageFactory 等待元素不可见
How to wait for invisibility of an element through PageFactory using Selenium and Java
有没有办法使用 PageFactory 注释等待 Selenium 中不存在的元素?
使用时:
@FindBy(css= '#loading-content')
WebElement pleaseWait;
定位元素,然后:
wait.until(ExpectedConditions.invisibilityOfElementLocated(pleaseWait));
我会得到:
org.opeqa.selenium.WebElement cannot be converted to org.openqa.selenium.By
我可以通过以下方式完成我需要的事情:
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector('loading-content')));
但是,我希望能够使用 PageFactory 注释以保持框架的一致性。有办法吗?
invisibilityOfElementLocated
需要定位器,但您发送的是网络元素,这就是它抛出错误的原因。您可以通过使用以下命令检查网络元素列表来执行操作:
wait.until(ExpectedConditions.invisibilityOfAllElements(Arrays.asList(pleaseWait)));
更新答案:
如果你想检查页面上不存在该元素,那么你可以检查它的列表大小是否等于 0,因为当它不显示在 UI 上时,它的列表大小将为 0。
您可以使用以下方式获取元素列表:
@FindBy(css='#loading-content')
List<WebElement> pleaseWait;
您可以使用以下方法检查列表大小是否为 0:
if(pleaseWait.size()==0){
System.out.println("Element is not visible on the page");
// Add the further code here
}
而且这也不会给 NoSuchElement 例外。
您可以使用正确的预期条件,还有:
wait.until(ExpectedConditions.invisibilityOf(pleaseWait));
希望对您有所帮助!
在 PageObjectModel 中使用 PageFactory 时,如果您希望元素 不可见 ,您可以将 Explicit Wait 支持与普通定位器工厂一起使用,并使用以下任一解决方案:
invisibilityOfElementLocated()
invisibilityOfElementLocated() 是用于检查元素是否不可见或不存在于 DOM 上的期望的实现。定义如下:
public static ExpectedCondition<java.lang.Boolean> invisibilityOfElementLocated(By locator)
An expectation for checking that an element is either invisible or not present on the DOM.
Parameters:
locator - used to find the element
Returns:
true if the element is not displayed or the element doesn't exist or stale element
代码块:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.WebDriverWait;
public class fooPage {
WebDriver driver;
public fooPage(WebDriver driver)
{
PageFactory.initElements(driver, this);
}
//you don't need this
//@FindBy(css= '#loading-content')
//WebElement pleaseWait;
public void foo()
{
Boolean bool = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector('#loading-content')));
//other lines of code
}
}
作为替代方法,您还可以使用 invisibilityOf()
方法,如下所示:
invisibilityOf()
invisibilityOf() 是期望检查元素不可见的实现。定义如下:
public static ExpectedCondition<java.lang.Boolean> invisibilityOf(WebElement element)
An expectation for checking the element to be invisible
Parameters:
element - used to check its invisibility
Returns:
Boolean true when elements is not visible anymore
代码块:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.WebDriverWait;
public class fooPage {
WebDriver driver;
public fooPage(WebDriver driver)
{
PageFactory.initElements(driver, this);
}
@FindBy(css= '#loading-content')
WebElement pleaseWait;
public void foo()
{
Boolean bool = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOf(fooPage.getWebElement()));
//other lines of code
}
public WebElement getWebElement()
{
return pleaseWait;
}
}
您可以在 How to use explicit waits with PageFactory fields and the PageObject pattern
中找到详细的讨论
默认情况下,如果页面上不存在该元素,invisibilityOf 不会 return 为真。 (NoSuchElementException)
public static ExpectedCondition<Boolean> invisibilityOf(final WebElement element) {
return new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver webDriver) {
return ExpectedConditions.isInvisible(element);
}
public String toString() {
return "invisibility of " + element;
}
};
}
您可以在 WebDriverUtils class 中创建一个方法,您可以改为使用:
public static ExpectedCondition<Boolean> invisibilityOf(final WebElement element) {
return new ExpectedCondition<>() {
public Boolean apply(WebDriver webDriver) {
try {
return !element.isDisplayed();
} catch (NoSuchElementException | StaleElementReferenceException e) {
return true;
}
}
public String toString() {
return "invisibility of " + element;
}
};
}
类似于 invisibilityOfElementLocated(final By locator)
有没有办法使用 PageFactory 注释等待 Selenium 中不存在的元素?
使用时:
@FindBy(css= '#loading-content')
WebElement pleaseWait;
定位元素,然后:
wait.until(ExpectedConditions.invisibilityOfElementLocated(pleaseWait));
我会得到:
org.opeqa.selenium.WebElement cannot be converted to org.openqa.selenium.By
我可以通过以下方式完成我需要的事情:
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector('loading-content')));
但是,我希望能够使用 PageFactory 注释以保持框架的一致性。有办法吗?
invisibilityOfElementLocated
需要定位器,但您发送的是网络元素,这就是它抛出错误的原因。您可以通过使用以下命令检查网络元素列表来执行操作:
wait.until(ExpectedConditions.invisibilityOfAllElements(Arrays.asList(pleaseWait)));
更新答案:
如果你想检查页面上不存在该元素,那么你可以检查它的列表大小是否等于 0,因为当它不显示在 UI 上时,它的列表大小将为 0。
您可以使用以下方式获取元素列表:
@FindBy(css='#loading-content')
List<WebElement> pleaseWait;
您可以使用以下方法检查列表大小是否为 0:
if(pleaseWait.size()==0){
System.out.println("Element is not visible on the page");
// Add the further code here
}
而且这也不会给 NoSuchElement 例外。
您可以使用正确的预期条件,还有:
wait.until(ExpectedConditions.invisibilityOf(pleaseWait));
希望对您有所帮助!
在 PageObjectModel 中使用 PageFactory 时,如果您希望元素 不可见 ,您可以将 Explicit Wait 支持与普通定位器工厂一起使用,并使用以下任一解决方案:
invisibilityOfElementLocated()
invisibilityOfElementLocated() 是用于检查元素是否不可见或不存在于 DOM 上的期望的实现。定义如下:
public static ExpectedCondition<java.lang.Boolean> invisibilityOfElementLocated(By locator)
An expectation for checking that an element is either invisible or not present on the DOM.
Parameters:
locator - used to find the element
Returns:
true if the element is not displayed or the element doesn't exist or stale element
代码块:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.ui.WebDriverWait; public class fooPage { WebDriver driver; public fooPage(WebDriver driver) { PageFactory.initElements(driver, this); } //you don't need this //@FindBy(css= '#loading-content') //WebElement pleaseWait; public void foo() { Boolean bool = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector('#loading-content'))); //other lines of code } }
作为替代方法,您还可以使用 invisibilityOf()
方法,如下所示:
invisibilityOf()
invisibilityOf() 是期望检查元素不可见的实现。定义如下:
public static ExpectedCondition<java.lang.Boolean> invisibilityOf(WebElement element)
An expectation for checking the element to be invisible
Parameters:
element - used to check its invisibility
Returns:
Boolean true when elements is not visible anymore
代码块:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.ui.WebDriverWait; public class fooPage { WebDriver driver; public fooPage(WebDriver driver) { PageFactory.initElements(driver, this); } @FindBy(css= '#loading-content') WebElement pleaseWait; public void foo() { Boolean bool = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOf(fooPage.getWebElement())); //other lines of code } public WebElement getWebElement() { return pleaseWait; } }
您可以在 How to use explicit waits with PageFactory fields and the PageObject pattern
中找到详细的讨论默认情况下,如果页面上不存在该元素,invisibilityOf 不会 return 为真。 (NoSuchElementException)
public static ExpectedCondition<Boolean> invisibilityOf(final WebElement element) {
return new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver webDriver) {
return ExpectedConditions.isInvisible(element);
}
public String toString() {
return "invisibility of " + element;
}
};
}
您可以在 WebDriverUtils class 中创建一个方法,您可以改为使用:
public static ExpectedCondition<Boolean> invisibilityOf(final WebElement element) {
return new ExpectedCondition<>() {
public Boolean apply(WebDriver webDriver) {
try {
return !element.isDisplayed();
} catch (NoSuchElementException | StaleElementReferenceException e) {
return true;
}
}
public String toString() {
return "invisibility of " + element;
}
};
}
类似于 invisibilityOfElementLocated(final By locator)