java - Selenium 测试设置

标签 java selenium junit

我需要登录才能开始测试。因此,在我的测试类中,我使用 @BeforeClass 方法登录到我的应用程序。然后我开始简单测试,但没有成功。当我从 @BeforeClass 中删除我的登录名并将其用于我的测试时,它工作正常。但我不想在开始之前登录所有测试。我认为我的对象是静态的,但我不知道为什么。 这是我不工作的代码:

public class ModulesTests extends FunctionalTest {

    static LoginPage loginPage;
    static LoginPageReceipt loginPageReceipt;

    @BeforeClass
    public static void login() {
        FunctionalTest.driver.get(GlobalVariables.URL);
        loginPage = new LoginPage(FunctionalTest.driver);
        loginPageReceipt = loginPage.login(GlobalVariables.USER_NAME, GlobalVariables.PASSWORD);
    }

    @Test
    public void products() {
        ProductsPage productsPage = loginPageReceipt.productsPage();
    }    
}

这是它的工作原理:

public class ModulesTests extends FunctionalTest {

@BeforeClass
public static void login() {
    FunctionalTest.driver.get(GlobalVariables.URL);        
}

@Test
public void products() {
    LoginPage loginPage = new LoginPage(FunctionalTest.driver);
    LoginPageReceipt loginPageReceipt = loginPage.login(GlobalVariables.USER_NAME, GlobalVariables.PASSWORD);
    ProductsPage productsPage = loginPageReceipt.productsPage();
}   

}

我的其余类(class):

public class FunctionalTest {
    protected static WebDriver driver;

    @BeforeClass
    public static void setUp() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");
        System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\chromedriver.exe");
        driver = new ChromeDriver(options);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @After
    public void cleanUp() {
        driver.manage().deleteAllCookies();
    }

    @AfterClass
    public static void tearDown() {
        driver.close();
    }
}

public class LoginPage extends PageObject {

    @FindBy(id = "UserName")
    private WebElement userName;

    @FindBy(id = "Password")
    private WebElement password;

    @FindBy(id = "loginButton")
    private WebElement loginButton;

    public LoginPage(WebDriver driver) {
        super(driver);
        assertTrue(userName.isDisplayed());
        assertTrue(password.isDisplayed());
        assertTrue(loginButton.isDisplayed());
    }

    public void enterUserName(String userName) {
        this.userName.clear();
        this.userName.sendKeys(userName);
    }

    public void enterUserPassword(String password) {
        this.password.clear();
        this.password.sendKeys(password);
    }

    public LoginPageReceipt login(String userName, String password) {
        enterUserName(userName);
        enterUserPassword(password);
        loginButton.click();
        return new LoginPageReceipt(driver);
    }
}

public class LoginPageReceipt extends PageObject {

    public NavigationModules mainNav;

    @FindBy(xpath = "//*[@id=\"loginPartial\"]")
    private WebElement userNamePanel;

    @FindBy(id = "products-menuitem")
    private WebElement goToProductsPage;

    public LoginPageReceipt(WebDriver driver) {
        super(driver);
    }

    public String loginConfirmation() {
        return  userNamePanel.getText();
    }

    public ProductsPage productsPage() {
        System.out.println(goToProductsPage.getText());
        goToProductsPage.click();
        return new ProductsPage(driver);
    }

    public NavigationModules initModuleNav() {
        return new NavigationModules(driver);
    }   
}

public class ProductsPage extends PageObject {

    @FindBy(id = "products-content-navigation")
    private WebElement productMenu;

    public ProductsPage(WebDriver driver) {
        super(driver);
        assertTrue(productMenu.isDisplayed());
    }
}

public class PageObject {

    protected WebDriver driver;

    public PageObject(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
        System.out.println(getClass().getName());
    }
}

编辑。我刚刚看到,当我使用 @BeforeClass 方法时,我还得到 java.lang.reflect.constructor.newinstance(unknown source) 异常。

最佳答案

您应该使用@Before,以便所有测试都必须先登录才能继续,同时,@BeforeClass 运行一次,以防万一多个测试共享相同的对象。

请看一下这个link .

关于java - Selenium 测试设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40526857/

相关文章:

c# - PhantomJS 传递 HTML 字符串并返回页面源代码

Python/ Selenium - "no such element: Unable to locate element"

java - 如何在 Selenium 中打印具有共同CSS值的元素

java - 在 JUnit @BeforeClass 中加载属性文件

JAVA - 将方法返回类型从 void 更改为 String 会立即创建 'dead' 代码?

java - 在 Android 中将导航 Intent 设置为 Waze 时的标题

java - 验证 JUnit 中的具体异常详细信息

junit - 来自 JUnit 的 TestNG @RunWith

java - 在 Java 8 中遇到 - JDK-8023339 : j. u.Arrays.asList().removeIf() 是 "lazy"抛出 java.lang.UnsupportedOperationException

java - AWS API Gateway 生成 SDK 请求错误