我下面的页面对象模型中,我已经放置了所有的WebElement地址和方法,即id,xpath等在页面中。示例:在登录页面上,我们有用户名字段、密码字段和登录按钮。因此,所有这些都将在LoginPage.java.本页还包括使用Webelements的方法。所以从实际的测试用例中,我只是调用页面上定义的方法。这就是我的困境。我有几个测试步骤需要我点击一个元素。所以说我需要点击链接1,链接2和链接3。现在我要做的是为每个步骤编写一个单独的方法,并将它们保留在下面的页面上:
@FindBy(id = "someId1")
WebElement link1;
@FindBy(id = "someId2")
WebElement link2;
public void clickOnLink1(){
link1.click();
}
public void clickOnLink2(){
link2.click();
}
测试用例:
clickOnLink1();
clickOnLink2();
因此,如果我有50个步骤需要我点击50个不同的元素,我需要50个不同的方法,这是非常不恰当和低效的。我可以使用下面这样的通用方法:
public void clickOnElement(WebElement element) {
element.click();
}
我可以将我想要点击的元素传递给这个方法,它会帮我完成。
不幸的是,正如我之前所说,我遵循页面对象模型,因此所有的WebElement地址(如id)都存在于页面上,而不存在于测试用例中,因此我无法使用此方法,因为我需要通过测试用例中的WebElement。
有人能帮我一个不同的方法吗?
非常感谢。
这样如何,让您的标识符保持静态,然后从测试中调用传递它们。虽然我不会建议,因为测试可以改变标识符,很难理解为什么测试失败。
您的页面对象类
public class GoogleSearch {
@FindBy(name="q")
static WebElement searchBox;
public GoogleSearch(WebDriver driver){
PageFactory.initElements(driver, this);
driver.get("https://www.google.com");
}
public void enterText(WebElement element, String text){
element.sendKeys(text);
}
}
您的测试类应该是这样的
public class GoogleTest {
WebDriver driver;
@BeforeMethod
public void setup(){
driver = new FirefoxDriver();
}
@AfterMethod
public void tearDown(){
driver.quit();
}
@Test
public void SearchOnGoogle(){
GoogleSearch googleSearchPage = PageFactory.initElements(driver, GoogleSearch.class);
googleSearchPage.enterText(GoogleSearch.searchBox, "selenium webdriver");
}
}
为了进一步优化,可以在BasePage中使用这个enterText方法,每个页面对象都可以扩展这个BasePage类
public class Login_Page {
private static WebElement element = null;
//username
public static WebElement Textbox_UserName (WebDriver driver)
{
element = driver.findElement(By.id("username"));
return element;
}
现在,在测试用例方法中,只需调用以下内容:
@Test
public void Llogin()
{
//initiate webdriver
//driver.get("url")
Login_page.Textbox_UserName(driver).sendKeys("username")
}
您可以使用以下内容:
public class Login_Page {
@FindBy(id = "someId1")
WebElement link1;
@FindBy(id = "someId2")
WebElement link2;
//constructor
public Login_Page(driver) {
PageFactory.initElements(driver, this);
}
//Generic Click method
public boolean genericClick(WebDriver driver, WebElement elementToBeClicked)
{
try{
elementToBeClicked.click();
return true;
}
catch(Exception e){
return false;
}
}
现在在测试方法中:
@Test
public void LoginTest()
{
Webdriver driver = new FirefoxDriver();
driver.get("someurl")
Login_Page lp = new Login_Page(driver);
lp.genericClick(driver, lp.link1);
}
问题内容: 我正在遵循页面对象模型来自动化一个应用程序中的流程。在模块之一中,我必须声明页面标题和更多消息。截至目前,我将我的断言代码放在PageFactory本身中,如下所示: 我从实现TestNG的主文件中调用assert方法,如下所示: 目前,我正在通过3个程序包运行执行程序。浏览器工厂的“ Helper”软件包,PageFactories的“ Pages”软件包和Testcase的“ Te
我正在使用Selenium为我的网站构建一个测试框架,我实际上希望您在使用页面对象模型时对良好实践的想法:让我们说,我有一个欢迎页面,其中包含一个注销按钮存在的标题,这个标题可以在大多数页面中看到在我的页面中,我认为最好为标题写一个单独的类,比如: 公共类欢迎页 我的问题是,你认为在欢迎页面中包含标题作为属性更好还是应该将它们分开? 让我们以注销测试方法的代码为例: 案例一: 案例2: 第二个问题
是否有任何Gem(比如siteprism:用于Web自动化测试)可以在我的移动自动化测试项目中使用,以使用页面对象模型模式定义屏幕。 提前谢谢
我正在使用Perl和Selenium构建一个测试自动化项目。我正在使用页面对象模型。我有点不确定Selenium驱动程序将适合页面对象模型的实现。 每个页面对象是否应该“有”一个驱动程序?我的想法是,每个页面对象代表页面向用户提供的一组服务。考虑到这个概念,页面对象与驱动程序没有“has-a”关系。页面对象与驱动程序交互。不过,我仍在寻求建议。我应该将驱动程序作为web应用程序中每个页面对象的一部
第一次海报。我已经在UI自动化领域工作了很多年,但直到最近才被介绍/指示使用页面对象模型。其中大部分是常识,包括我已经使用过的技术,但是有一个特别好的点我还没有能够在我自己的头脑中证明,尽管我广泛地寻找一个合理的解释。我希望这里有人能启发我,因为当我试图将POM与我自己的最佳实践相结合时,这个问题已经引起了一些恐慌。 从http://code.google.com/p/selenium/wiki/
我们如何等待IWebElement(重新)连接到DOM?我的场景是这样的,我从dropdown1中选择一个值,然后单击dropdown2上的数据绑定。所以当我的测试像从Dd1中选择“foo”,然后从Dd2中选择“bar”- 但是我真的不想把定位器字符串(“foo”)带到我的测试逻辑中,因为它似乎破坏了使用页面对象模型的意义。使用页面对象模型时,我已经有了IWebElement实例 那么,您知道隐式