Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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 硒测试设置_Java_Selenium_Junit - Fatal编程技术网

Java 硒测试设置

Java 硒测试设置,java,selenium,junit,Java,Selenium,Junit,我需要登录才能开始测试。因此,在我的测试类中,我使用@BeforeClass方法登录到我的应用程序。然后我开始简单的测试,但它不起作用。当我从@BeforeClass中删除我的登录名并对其进行测试时,它工作正常。但我不想在启动测试之前登录所有测试。我想我的物体是静态的,这是有问题的,但我不知道为什么。 以下是我的非工作代码: public class ModulesTests extends FunctionalTest { static LoginPage loginPage;

我需要登录才能开始测试。因此,在我的测试类中,我使用@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(未知源代码)异常。

你应该在
之前使用
,这样你的所有测试都必须在继续之前登录,同时,
@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模式,并在类之前删除,现在一切正常:)