Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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在Selenium WebDriver中使用PageObjects、Page Factory和WebDriverWait_Java_Selenium Webdriver_Pageobjects - Fatal编程技术网

使用Java在Selenium WebDriver中使用PageObjects、Page Factory和WebDriverWait

使用Java在Selenium WebDriver中使用PageObjects、Page Factory和WebDriverWait,java,selenium-webdriver,pageobjects,Java,Selenium Webdriver,Pageobjects,我一直在使用SeleniumWebDriver为我所处理的一些项目实现功能测试。我正在尝试使用页面对象设计模式和页面工厂来区分我的定位器。我还创建了一个静态WaitTool对象(singleton),它使用可选的超时参数实现了几种等待技术 我当前的问题是,我想在PageFactory尝试初始化WebElements之前使用wait方法。我想等待的原因是,PageFactory可能会在页面上提供页面元素之前尝试初始化这些元素 以下是PageObject示例: public class SignIn

我一直在使用SeleniumWebDriver为我所处理的一些项目实现功能测试。我正在尝试使用页面对象设计模式和页面工厂来区分我的定位器。我还创建了一个静态WaitTool对象(singleton),它使用可选的超时参数实现了几种等待技术

我当前的问题是,我想在PageFactory尝试初始化WebElements之前使用wait方法。我想等待的原因是,PageFactory可能会在页面上提供页面元素之前尝试初始化这些元素

以下是PageObject示例:

public class SignInPage extends PageBase {
    @FindBy(id = "username")
    @CacheLookup
    private WebElement usernameField;

    @FindBy(id = "password")
    @CacheLookup
    private WebElement passwordField;

    @FindBy(name = "submit")
    @CacheLookup
    private WebElement signInButton;

    public SignInPage(WebDriver driver) {
        super(driver);

        WaitTool.waitForPageToLoad(driver, this);

        // I'd like initialisation to occur here
    }

    public MainPage signInWithValidCredentials(String username, String password){
        return signIn(username, password, MainPage.class);
    }

    private <T>T signIn(String username, String password, Class<T> expectedPage) {
        usernameField.type(username);
        passwordField.type(password);
        signInButton.click();

        return PageFactory.initElements(driver, expectedPage);
    }
}

我倾向于尽可能多地将我的逻辑放在页面对象中(包括等待),因为它使测试用例更具可读性。

PageFactroy中的WebElements实际上是WebElements的代理。这意味着每次访问WebElement时,它都会执行搜索以在页面上查找该元素

这有一些好处:

  • 初始化PageFactory时,会配置代理,但此时找不到WebElements(因此不会出现NoTouchElementException)
  • 每次您使用WebElement时,它都会再次找到它,所以您不应该使用StaleElementException
您正在使用@CacheLookup注释,这将使您失去第二个好处,因为它将找到元素一次,然后保留对它的引用,现在您更可能看到StaleElementExceptions

也就是说,您仍然保留了主要的好处,即Selenium在首次使用之前不会进入页面并实际找到元素

总之,你需要做的就是搬家

PageFactory.initElements(driver, this);

我想这意味着我不能在signIn函数中返回
PageFactory.initElements(driver,expectedPage)
PageFactory.initElements(driver,this.class)似乎不起作用。但是,提供
this
this.getClass()
是可行的,但我不确定这是否符合我的要求。很抱歉,这是我回答中的一个错误。事实上,我的意思是(答案更新为显示正确的代码段),如果我理解正确,您只是担心当您实例化类时,它将开始抛出NosUchelementException错误,因为页面可能没有加载PageFactory引用的所有WebElement。如果这是你的担忧,那就不会发生。执行“PageFactory.initElements(驱动程序,this);”时此时它将配置所有代理,但在您实际使用其中一个WebElements之前,它不会尝试在页面上查找该元素。@Ardesco:在我阅读了这篇文章和您的评论之后,我有一个问题。在这种情况下,代理是什么意思?
PageFactory.initElements(driver, this);