Java 硒测试设置
我需要登录才能开始测试。因此,在我的测试类中,我使用@BeforeClass方法登录到我的应用程序。然后我开始简单的测试,但它不起作用。当我从@BeforeClass中删除我的登录名并对其进行测试时,它工作正常。但我不想在启动测试之前登录所有测试。我想我的物体是静态的,这是有问题的,但我不知道为什么。 以下是我的非工作代码:Java 硒测试设置,java,selenium,junit,Java,Selenium,Junit,我需要登录才能开始测试。因此,在我的测试类中,我使用@BeforeClass方法登录到我的应用程序。然后我开始简单的测试,但它不起作用。当我从@BeforeClass中删除我的登录名并对其进行测试时,它工作正常。但我不想在启动测试之前登录所有测试。我想我的物体是静态的,这是有问题的,但我不知道为什么。 以下是我的非工作代码: public class ModulesTests extends FunctionalTest { static LoginPage loginPage;
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(未知源代码)异常。你应该在
之前使用,这样你的所有测试都必须在继续之前登录,同时,@BeforeClass
运行一次,如果多个测试共享同一个对象,它是有用的
请看一下。您应该使用@Before
,这样所有测试都必须在继续之前登录,同时,@BeforeClass
只运行一次,以防多个测试共享相同的对象
请查看此项。但在启动测试之前,我不想登录所有测试。我想将我的对象共享给另一个测试。登录成功吗?你到底犯了什么错误?是的,发生了一些奇怪的事情。我被注销了,而NoTouchElementException这在我注销时是显而易见的。在我的情况下,我使用一个提示来避免所有这一切,我为我登录的浏览器保存了一个profile(因此我的凭据存储在浏览器profile中),所以我根本不必登录。很抱歉,我不知道为什么会发生这种奇怪的行为。如果@Before可以解决你的问题,不要浪费太多时间,或者尝试改变你正在走的路!但我不想在启动测试之前登录所有测试。我想将我的对象共享给另一个测试。登录成功吗?你到底犯了什么错误?是的,发生了一些奇怪的事情。我被注销了,而NoTouchElementException这在我注销时是显而易见的。在我的情况下,我使用一个提示来避免所有这一切,我为我登录的浏览器保存了一个profile(因此我的凭据存储在浏览器profile中),所以我根本不必登录。很抱歉,我不知道为什么会发生这种奇怪的行为。如果@Before可以解决你的问题,不要浪费太多时间,或者尝试改变你正在走的路!你在同一个班级里有多少个@BeforeClass?。我的意思是login()和setup()方法在同一个类中?第一,LoginPage类中没有login(),setup在moduletest中。我会编辑这些课程。但也许你的建议是好的。我的测试有BeforeClass方法,但我有这个方法的类扩展了第二个类,也有BeforeClass方法。是的,我要告诉你同样的事情。我们必须看看这个答案。希望有帮助!也许这就是原因。但我将FunctionalTest切换到singleton模式并删除BeforeClass,现在一切正常:)同一个类中有多少个@BeforeClass?。我的意思是login()和setup()方法在同一个类中?第一,LoginPage类中没有login(),setup在moduletest中。我会编辑这些课程。但也许你的建议是好的。我的测试有BeforeClass方法,但我有这个方法的类扩展了第二个类,也有BeforeClass方法。是的,我要告诉你同样的事情。我们必须看看这个答案。希望有帮助!也许这就是原因。但我将FunctionalTest切换到singleton模式,并在类之前删除,现在一切正常:)