我正在使用POM设计模式创建一个UI测试自动化框架。在阅读了SeleniumHQ页面中的页面对象之后,我开始思考应该在页面对象中创建哪些方法。
让我们举一个登录页面对象的简单例子,该对象由用户名、密码文本框和提交按钮组成。SeleniumHQ link创建了以下方法:
1. typeUsername(String username)
2. typePassword(String password)
3. submitLogin()
4. submitLoginExceptionFailure()
5. loginAs(String username, String password)
看着这些方法,我有点困惑。当我已经在创建loginAs方法时,为什么要创建前3个方法(typeUsername、typePassword、submitLogin)。有什么想法吗?
SeleniumHQ Link-https://github.com/SeleniumHQ/selenium/wiki/PageObjects
粘贴代码页登录页的对象代码:
public class LoginPage {
private final WebDriver driver;
public LoginPage(WebDriver driver) {
this.driver = driver;
// Check that we're on the right page.
if (!"Login".equals(driver.getTitle())) {
// Alternatively, we could navigate to the login page, perhaps logging out first
throw new IllegalStateException("This is not the login page");
}
}
// The login page contains several HTML elements that will be represented as WebElements.
// The locators for these elements should only be defined once.
By usernameLocator = By.id("username");
By passwordLocator = By.id("passwd");
By loginButtonLocator = By.id("login");
// The login page allows the user to type their username into the username field
public LoginPage typeUsername(String username) {
// This is the only place that "knows" how to enter a username
driver.findElement(usernameLocator).sendKeys(username);
// Return the current page object as this action doesn't navigate to a page represented by another PageObject
return this;
}
// The login page allows the user to type their password into the password field
public LoginPage typePassword(String password) {
// This is the only place that "knows" how to enter a password
driver.findElement(passwordLocator).sendKeys(password);
// Return the current page object as this action doesn't navigate to a page represented by another PageObject
return this;
}
// The login page allows the user to submit the login form
public HomePage submitLogin() {
// This is the only place that submits the login form and expects the destination to be the home page.
// A seperate method should be created for the instance of clicking login whilst expecting a login failure.
driver.findElement(loginButtonLocator).submit();
// Return a new page object representing the destination. Should the login page ever
// go somewhere else (for example, a legal disclaimer) then changing the method signature
// for this method will mean that all tests that rely on this behaviour won't compile.
return new HomePage(driver);
}
// The login page allows the user to submit the login form knowing that an invalid username and / or password were entered
public LoginPage submitLoginExpectingFailure() {
// This is the only place that submits the login form and expects the destination to be the login page due to login failure.
driver.findElement(loginButtonLocator).submit();
// Return a new page object representing the destination. Should the user ever be navigated to the home page after submiting a login with credentials
// expected to fail login, the script will fail when it attempts to instantiate the LoginPage PageObject.
return new LoginPage(driver);
}
// Conceptually, the login page offers the user the service of being able to "log into"
// the application using a user name and password.
public HomePage loginAs(String username, String password) {
// The PageObject methods that enter username, password & submit login have already defined and should not be repeated here.
typeUsername(username);
typePassword(password);
return submitLogin();
}
}
将代码细切成更多的方法可以实现更大的原子化。没有什么可以阻止您将typeUsername()
,typePassword()
和submitLogin()
分组到login()
方法中。
这样做的好处是更准确地知道你的登录失败了,比如输入密码,而不是“在登录页面的某个地方”。
您可能需要检查是否仅键入用户名,然后单击提交按钮显示正确的错误消息,或者仅显示密码,等等。
我通常查看页面并尝试总结用户在该页面上可以执行的“操作”,每个操作都成为一种方法。不同的行动可能在不同的“层面”。e、 在博客网站上,用户可以输入博客标题和博客内容,这是用户可以做的两个动作,但从另一个抽象层看,用户希望“创建”一篇文章。因此该函数可能会再次调用其他函数。
基本上和其他编程一样,您有多个抽象层,这就是为什么您首先有页面对象。
只需使用迭代开发,创建一个做您想要测试的功能,如果您发现自己在其他功能中重用相同的代码(或标识符),请在新功能中分离这些代码(或标识符)
1、简单工厂模式 简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。 2、工厂方法模式 应用程序将对象的创建及初始化职责交给工厂对象,工厂Bean。 定义工厂方法,然后通过config.xml配置文件,将其纳入Spring容器来管理,需要通过factory-method指
本文向大家介绍熟悉哪些设计模式?相关面试题,主要包含被问及熟悉哪些设计模式?时的应答技巧和注意事项,需要的朋友参考一下 按照自己的实际情况回答,当然是越多越好。比如我自己也就熟悉个单例模式。
问题内容: 我设计了10多个站点,但我仍然对“我应该使用正确的单位是什么”有个疑问。无论是px还是em或%。请引导我正确的方向 编辑1:用于版式(特别是对于容器盒) 问题答案: 根据上下文的不同单位。如果有一个最适合每种情况的单位,那么就不会有那么多单位。 按照经验法则: 如果您正在处理屏幕媒体: 使用的字体大小 使用的图像 使用,或表示盒子尺寸 线高使用比例 如果您使用打印介质: 最好避免(无论
问题内容: java web设计模式有哪些? 问题答案: 模型视图控制器模式 你要使用的核心(架构)设计模式是Model-View-Controller模式。该控制器是由一个Servlet其中(在)直接创造来表示/使用特定的模型和视图基于该请求。该模型将由Javabean类表示。在包含动作(行为)的业务模型和包含数据(信息)的数据模型中,这通常可以进一步划分。该视图是由具有对(直接访问JSP文件来
能接触到的常见问法: 项目中有用到什么设计模式?(前端更多点) 重构使用了什么设计模式?(如果你项目强调了重构一般会问) 说说对 XX 模式的理解?(个人接触过的是单例和工厂,这两个比较多) 有接触到哪些?实际用到过哪些?(通用) 除了这些,还有一些不常见的进阶和基础问法,这些直接在下面整理 -- 设计模式这个主题还挺玄乎的,个人直观体验是,自己日常实习那段时间问得挺频繁的,可能是因为没啥好问的。
我正在实现一个工厂,一个负责跨应用程序管理令牌的类。我将在这个简化的示例之后解释我面临的问题: 最后是实现: 现在,在我们的中,我们要创建一个jWTTokenManager实例: TokenManager类型未定义方法aMethodNotDefinedInInterface()