Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@FindBy注释和PageFactory映射动态元素_Java_Selenium_Automated Tests - Fatal编程技术网

Java 使用@FindBy注释和PageFactory映射动态元素

Java 使用@FindBy注释和PageFactory映射动态元素,java,selenium,automated-tests,Java,Selenium,Automated Tests,对于下面的Page对象示例类,我有一个accountsLink私有成员,它在加载时映射到登录页面上的非动态元素。当从构造函数调用initElements方法时,使用FindBy注释初始化它 public class Login { private WebDriver driver; @FindBy(id = "account") private WebElement accountsLink; //constructor, elements are initi

对于下面的Page对象示例类,我有一个accountsLink私有成员,它在加载时映射到登录页面上的非动态元素。当从构造函数调用initElements方法时,使用FindBy注释初始化它

public class Login {
    private WebDriver driver;

    @FindBy(id = "account")
    private WebElement accountsLink;

    //constructor, elements are initialized by the PageFactory
    public MainPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    //clicking accounts opens a dynamic ajax menu which has a Sign In Button
    public SignInPage clickAccountsLink() {
        accountsLink.click();   
        WebElement signInButton = driver.findElement(By.id("signin"));
        signInButton.click();
        return new SignInPage(driver);
    }
}
现在来看问题。我有另一个元素(signInButton),它只有在单击accountsLink元素时才会动态加载。此操作不会将您带到另一个页面,只会显示一个ajax菜单,其中将显示登录按钮

我的问题是,由于signInButton元素只有在单击accountsLink元素时才会出现,所以它是否可以声明为带有FindBy注释的登录类的成员,或者我是否必须坚持使用clickAccountsLink方法中的driver.findElement(By.id(“signin”))的当前解决方案


我希望我的问题有意义。

当调用
PageFactory.initElements
时,它解析当前DOM。如果
WebElement
在该时间内不存在,则不能将其作为变量的值给定,正如您不能使用
driver.findElement
查找不存在的
WebElement
一样


您的解决方案是可行的,尽管我会使用,并且在加载
登录按钮时,您可以声明,我不认为它会给您带来任何错误。页面工厂在初始化类时创建一个伪元素。它仅在第一次与图元相交时创建实际图元

例如,在下面的类中,NoExistingElement元素不存在,如果我调用类的enterText方法,它不会给我任何错误。测试用例将毫无错误地通过

然而,如果我尝试调用NoExistingElement元素上的任何函数,那么只有它会失败,出现Webdriver异常,ElementNotFoundException

   public class GoogleSearch {

    @FindBy(name="q")
    static WebElement searchBox;

    @FindBy(name = "qqqqq")
    WebElement NoExistingElement;

    public GoogleSearch(WebDriver driver){
        PageFactory.initElements(driver, this);
        driver.get("https://www.google.com");

    }

    public void searchOnGoogle(String text){
        searchBox.sendKeys(text);

    }
}

我编写这个类是为了提供一个快速示例。但在编写实际代码时,我肯定会使用显式等待和预期条件。谢谢。这就是我完全避免使用
PageFactory
的原因之一。最后,您将混合使用带注释的元素,并根据需要对页面进行刮削。为了保持一致性和性能,我更喜欢随时根据需要刮取页面。这在纯静态网页中是有意义的,但今天几乎没有任何网站被认为是静态的。你是对的,我明白了。但是如果NoExistingElement实际存在,我可以再次调用PageFactory.initElements进行初始化吗?缺点和(性能影响)是,它将重新初始化那些在第一次调用initElements时已经找到的元素。@正如我所说的,它不会用实际值初始化对象,就像惰性初始化一样,只有在第一次执行某些操作时,才填充实际值。i、 e.
searchBox.sendKeys(文本)时为out此时调用时,将填充
搜索框
。希望现在一切都清楚了。如果真是这样,那么为什么要调用PageFactory.initElements()?它是一个创建类的对象并用代理(dummy)初始化web元素的方法