在我的测试类

时间:2016-11-17 15:01:30

标签: java selenium selenium-webdriver pageobjects

基本上,我想断言(来自我的测试类)WebElement包含text()。由于我的所有WebElements都是在我的page.class中定义的,因此我认为我必须将它们公之于众。

我遇到了一些webdriver和元素的问题,我想这可能是因为多个测试类同时从页面类访问WebElements。我的问题是:WebElements必须是私有的吗?

代码示例:

我见过的所有PageFactory教程都说要将你的WebElements设为私有,比如

    @FindBy(xpath = "//*[@id='searchStringMain']")
    private WebElement searchField;

但是为了断言一个元素包含文本(来自另一个类),我必须像这样定义它们:

    @FindBy(xpath = "(//*[contains (text(),'Hrs')])[2]")
    public static WebElement yourLoggedTime;

2 个答案:

答案 0 :(得分:1)

考虑这个例子:

package org.openqa.selenium.example;

import org.openqa.selenium.By;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.WebElement;

public class GoogleSearchPage {
    // The element is now looked up using the name attribute
    @FindBy(how = How.NAME, using = "q")
    private WebElement searchBox;


    public void searchFor(String text) {
        // We continue using the element just as before
        searchBox.sendKeys(text);
        searchBox.submit();
    }
}

搜索框是私有的,但方法searchFor是公开的。测试将使用searchFor但从不使用searchBox。

我通常把页面工厂的initElements调用放在页面构造函数的最后一行。这使得所有公共函数都可用于测试。所以

package org.openqa.selenium.example;

import org.openqa.selenium.By;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.WebElement;

public class GoogleSearchPage {
    public WebDriver driver;
    // The element is now looked up using the name attribute
    @FindBy(how = How.NAME, using = "q")
    private WebElement searchBox;

    public GoogleSearchPage(WebDriver driver) {
        this.driver = driver
        PageFactory.initElements(driver, this);
    }


    public void searchFor(String text) {
        // We continue using the element just as before
        searchBox.sendKeys(text);
        searchBox.submit();
    }
}

在您的测试中,您可以执行以下操作:

new GoogleSearchPage(webDriver).searchFor("Foo");

答案 1 :(得分:0)

您可以将您的课程公开,但作为标准惯例,建议您使用getter方法提交课程而非直接存档。
问题是您使用公开的static关键字。当您使用带有(webelement)的@FindBy注释时,它会在类初始化时初始化(或者根据您调用initElements()时的实现)进行初始化。因此,webelement publicstatic没有问题。例如:

在您的网页课程中:

@FindBy(xpath = "(//*[contains (text(),'Hrs')])[2]")
public WebElement yourLoggedTime;

在测试中:

String yourLoggedTime = pageObj.yourLoggedTime.getText(); //pageObj is object of your page class