为什么这样做?
public void mymethod(){
wait.until(ExpectedConditions.invisibilityOfElementLocated(by.id("myid"));
}
这不起作用?我不明白。
@FindBy (id="myid")
WebElement myid;
public mypagefactory(WebDriver driver){
this.driver = driver;
PageFactory.initElements(driver);
}
public void mymethod(){
wait.until(ExpectedConditions.invisibilityOfElementLocated((By) myid));
}
我不断得到一个"无效的演员" "(By)"上的错误。我试图使用页面工厂方法。
答案 0 :(得分:1)
您正在尝试将WebElement强制转换为By,但它不是By元素,而是WebElement。
by.id(“myid”)返回By,所以没有问题。
答案 1 :(得分:1)
声明
@FindBy (id="myid")
WebElement myid;
相当于
By by = By.id("myid");
WebElement myid = driver.findElement(by);
正如您所看到myid
在两种情况下都是WebElement
类型(注释不会将其转换为By
类型的对象),同时从WebElement
转换为{{ 1}}是不可能的,因为它们是not sharing the same class hierarchy。
答案 2 :(得分:1)
条件invisibilityOfElementLocated
期待By
类型的定位器,但您提供代理的WebElement
。请改用invisibilityOfAllElements
:
wait.until(ExpectedConditions.invisibilityOfAllElements(Arrays.asList(myid)));
答案 3 :(得分:0)
当我遇到需要 By 定位器用于 ExpectedConditions 并且我在页面对象工厂中有定位器时,我的解决方案是使用一个包含定位器的字符串,然后构建我的 By 对象和元素定位器
public class PageObject(){
private static final String ID = "myid";
public @FindBy (id=ID)
WebElement myid;
public By getByID(){
return new By.ById(ID);
}
public PageObject(WebDriver driver){
this.driver = driver;
PageFactory.initElements(driver);
}
}
public void mymethod(){
By by = getByID();
wait.until(ExpectedConditions.invisibilityOfElementLocated(by);
}