我正在创建一个页面对象框架,在了解其概念的同时,我了解到页面工厂(@FindBy)与页面对象一起使用。然而,当我可以使用驱动程序时,我无法理解为什么我需要使用@FindBy。在页面对象类中使用我的定位器完成删除。例如:
//使用@FindBy编码
public class LoginPage{
public LoginPage(WebDriver driver)){
PageFactory.initElements(driver,this);
}
public WebElement q;
}
public class TestCase{
WebDriver driver=new FirefoxDriver();
LoginPage logPage=new LoginPage(driver);
public void enterUserName(){
logPage.q.sendKeys("username");
}
}
//带有driver.find元素的代码
public class LoginPage{
public WebElement q=driver.findElement(By.id('q'));
}
public class TestCase{
WebDriver driver=new FirefoxDriver();
LoginPage logPage=new LoginPage();
public void enterUsername(){
logPage.q.sendKeys("username");
}
}
这里的两个代码之间有什么区别,因为两个代码基本上都在做相同的事情?
从根本上讲,在测试如何运行、驱动程序正在做什么、是否使用驱动程序方面,可能并没有太大的差异。FindElement()或@FindBy注释。在我看来,使用@FindBy的“好处”在于,它可以引导您将与特定页面相关的所有WebElement和方法保存在一个位置,并将页面元素的查找与您在页面上执行的方法分离开来,例如,请参见下面的登录页面示例(在C中):
public class LoginPage
{
public IWebDriver Driver;
[FindsBy(How = How.Id, Using = "username")]
public IWebElement UsernameField;
[FindsBy(How = How.Id, Using = "password")]
public IWebElement PasswordField;
[FindsBy(How = How.Id, Using = "submit")]
public IWebElement SubmitButton;
public LoginPage(IWebDriver driver)
{
Driver = driver;
PageFactory.InitElements(this, new RetryingElementLocator(Driver, TimeSpan.FromSeconds(10)));
}
// By this point, all your elements on the page are declared and located,
// you're now free to carry out whatever operations you'd like on the page
// without having to make any further declarations
public void Login(string username, string password)
{
UsernameField.SendKeys(username);
PasswordField.SendKeys(password);
SubmitButton.Click();
}
}
因此,我可以说这主要是偏好,但也可以说,对于@FindBy注释带来的“整洁”/组织,有一些令人信服的理由。
问题内容: 从log.go(执行日志包): 只是一个函数包装器,为什么我应该用它代替or ? 有实际原因吗? 问题答案: 两件事不同: 通过包日志进行打印对于并发goroutine是安全的(而普通的则不是) 日志可以自动添加计时信息。 因此,这是两件完全不同的事情。log用于记录和格式化。(好吧,log使用相同的动词和标志,但这很方便)。
问题内容: Python 2.6引入了一个功能。 为什么有这个必要?可以总是输入而不是。 后者更多吗? 问题答案: PEP 3114描述了此更改。动机摘录: 该PEP建议将该方法重命名为,与Python中所有其他协议一致,在该协议中隐式调用方法作为语言级协议的一部分,并引入一个名为的内置函数来调用方法,与显式调用其他协议的方式。 请务必阅读此PEP,以获取更多有趣的细节。 至于为什么 你 要使用内
问题内容: 我现在已经实现了一些Java应用程序,到目前为止仅实现了桌面应用程序。我更喜欢使用不可变对象在应用程序中传递数据,而不是使用带有变量(setter 和getter )的对象,也称为JavaBeans。 但是在Java世界中,使用JavaBeans似乎更为常见,而且我不明白为什么应该使用JavaBeans。就个人而言,如果代码仅处理不可变的对象而不是始终改变状态,则代码看起来会更好。 在
问题内容: 实际上,这是一个类似的话题,几乎没有实用价值。据我了解,原语性能更好,除需要与对象相关的功能(例如检查)外,应在所有地方使用。对? 问题答案: 别忘了,由于为每次装箱而创建一个新的包装程序都是非常昂贵的,尤其是考虑到通常在一种方法的单个作用域中使用它,因此自动装箱将使用一组通用包装程序。 这实际上是flyweight设计模式的一种实现。当对一个众所周知的值进行装箱时,而不是创建一个新的
问题内容: 我是一个相对较新的QA工程师,致力于学习Selenium(使用Java),并且我想使用页面对象为页面建模。 目前,我的页面对象类是静态变量(用于定位页面元素的对象)和静态方法(用于获取By对象并执行页面功能)的集合。这对我来说似乎是最简单的方法,因为我的方法不需要依赖任何实例变量,而只需依赖定位符。 我只是在测试代码中根据需要调用这些方法。 但是,我读到的有关页面对象的所有内容都涉及实
我有一个用例,其中将有数据流到来,而我不能以相同的速度消耗它,并且需要一个缓冲区。这可以使用SNS-SQS队列来解决。我知道Kinesis解决了同样的目的,那么有什么区别呢?为什么我应该喜欢(或者不应该喜欢)Kinesis?