wait.until(ExpectedConditions.invisibilityOfElementLocated())和@FindBy?

时间:2016-09-01 21:02:17

标签: selenium selenium-webdriver webdriver

为什么这样做?

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)"上的错误。我试图使用页面工厂方法。

4 个答案:

答案 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);
}