我在Selenium测试项目中使用LoadableComponent<T>
。我有一个带有主页面的应用程序(建模为MainPage.java
),我从该页面进入登录页面(LoginPage
)。我输入了一些凭据,登录表单将我(如果凭证有效)再次重定向到MainPage
,启用了一些额外的功能。因为我使用MainPage
作为许多测试的起点,所以我必须使用有效的URL为load()
实现MainPage
方法。所以,如果我做的事情如下:
MainPage mainpage=new MainPage();
mainpage.get();
LoginPage loginPage=mainpage.clickLogin();
loginPage.setUser("whatever").setPassword("totally_secret");
mainpage = loginPage.clickJoin();
mainpage.get();
我无法确定指示我mainpage
的操作是否成功,因为无论如何,最后一次调用将加载页面。另一方面,如果我调用clickJoin()
方法而不将返回的对象分配给变量,我无法验证是否加载了正确的页面,并且我无法获得对其方法的引用以继续测试。我也可以使clickJoin()
方法返回void,但是如何在测试中获得对新页面的引用?
我该怎么处理呢?
答案 0 :(得分:1)
为什么甚至在mainpage.get()
之后致电loginPage.clickJoin()
?与页面上的元素的交互是否会将您带到下一个/上一个元素?
通常,您应该能够立即与mainPage
返回的clickJoin()
对象进行交互。 您不必再次致电get()
。如果你在没有它的情况下得到错误,可能是因为代码执行得太快,而没有真正等待页面正确加载。
为避免这种情况,您可以使用loginPage.clickJoin()
方法确保主页面已重新加载。
public MainPage clickJoin() {
joinLink.click(); //clicking some link/button or whatever should take you to the page
new WebDriverWait(driver, timeToWait).until(
//here you can use the ExpectedConditions class to wait for the title
//to change to a specified value or something similar. There's a wide
//variety of methods provided. Alternatively, you can implement the
// ExpectedCondition interface yourself
);
return new MainPage(driver);
}
如果页面加载失败,您将收到异常,测试将失败。
您不必像上面的伪代码那样完全相同,但WebDriverWait
似乎是一种确保在它们之间导航时加载正确页面的方法。
答案 1 :(得分:1)
不确定我是否100%清楚你所要求的是什么,但这就是我认为我会做的。页面对象上的公共方法应该更能代表用户操作(成功登录),而不是单个操作(填写单个字段)。
我在您的MainPage构造函数中添加了一个loggedIn标志,这可能有助于确定哪些操作/应该可用
class MainPage {
public MainPage(bool loggedIn) {
...
}
}
class LoginPage {
public LoginPage(){
...
}
public MainPage loginExpectSuccess(string username, string password) {
setUser(username);
setPassword(password);
clickJoin();
return new MainPage(true);
}
public LoginPage loginExpectFailure(string username, string password) {
setUser(username);
setPassword(password);
clickJoin();
return this;
}
private void setUser(string username) {
...
}
private void setPassword(string password) {
...
}
private void clickJoin() {
...
}
}
这样,您的测试可以简化为:
MainPage mainpage = new MainPage(false);
LoginPage loginPage=mainpage.clickLogin();
mainpage = loginPage.loginExpectSuccess("whatever", "totally_secret");
...
mainpage.nextUserAction(); //Do whatever a logged in user should be able to do, if user is not actually logged in successfully this will fail
答案 2 :(得分:1)
看看这个; http://sellotapetest.blogspot.co.uk/2012/04/navigation-in-page-objects-returning.html?m=1
它解释了如何从同一方法动态返回不同的页面对象。
虽然它有C#示例,但在Java中可以实现类似的模式