【问题标题】:Selenium setting up for testsSelenium 为测试设置
【发布时间】:2016-11-10 11:46:34
【问题描述】:

我需要登录才能开始我的测试。因此,在我的测试类中,我创建了登录应用程序的@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();
}   

}

还有我的其他班级:

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) 异常。

【问题讨论】:

  • 同一个班级有多少个@BeforeClass?。我的意思是 login() 和 setup() 方法在同一个类中?
  • 一,LoginPage 类中没有 login(),ModulesTest 中设置。我将编辑这些课程。
  • 但也许你的建议是好的。我的测试有 BeforeClass 方法,但是我有这个方法的类扩展了第二个类,它也有 BeforeClass 方法。
  • 是的,我打算告诉你同样的事情。必须看看这个答案stackoverflow.com/questions/2132734/…。希望有所帮助!
  • 也许是这个原因。但是我将 FunctionalTest 切换到单例模式并删除 BeforeClass 现在一切正常:)

标签: java selenium junit


【解决方案1】:

您应该使用@Before,这样您的所有测试都必须先登录才能继续,同时,@BeforeClass 运行一次,这在多个测试共享相同对象的情况下很有用。

请看一下这个link

【讨论】:

  • 但我不想在开始之前登录所有测试。我想将我的对象分享给另一个测试。
  • 登录成功了吗?你得到的究竟是什么错误?
  • 是的,发生了一些奇怪的事情。我退出了,NoSuchElementException 当我退出时很明显。
  • 我用来避免这一切的一个提示,我为我登录的浏览器保存了一个配置文件(所以我的凭据存储在浏览器配置文件中),所以我不必须登录。
  • 很抱歉,我不知道为什么会发生这种奇怪的行为。如果@Before可以解决你的问题,不要浪费太多时间,或者尝试改变你正在走的路!
猜你喜欢
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2016-02-24
  • 2015-02-21
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多