页面对象模型

该随笔摘抄于https://www.guru99.com/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html

该随笔摘抄于https://www.guru99.com/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html

该随笔摘抄于https://www.guru99.com/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html

摘抄目的是自己以后方便找, 方便看

1 Page Object Model(POM) 是selenium webdriver中Object Repository设计模式

2 使用这种方式的好处在于解耦和, 代码可重用性高

3 PageFactory是POM概念中创建对象存储库的优化方法, 

emmmmmmmmmmmmmmmmmm

页面对象这种写法各有各的写法, 咱不敢说谁的就一定是好的, 谁的一定是不好的, 我在看selenium python文档(https://selenium-python-zh.readthedocs.io/en/latest/page-objects.html), 这儿写的时候对象仓库和操作方法, 测试用例, 都单独封装了, 

网上pageObject 写法也是形形色色,我个人感觉 https://selenium-python-zh.readthedocs.io/en/latest/page-objects.html 这儿要更好一点

eg. 这段代码是不使用pagefactory, 页面对象类, 由于这个类的构造器只有一个参数, webdriver, 所以在这个类必须要有一个webdriver才可以实例化, 就如其实我并没有看明白为什么一定要把webdriver作为构造参数传入,因为在哪儿初始化浏览器对象都是可以的 , 这儿的一些页面的公共方法可以抽取到外面, 在封装一个类, 这儿使用的是原生的 By index = By.name("index"); 方法查找元素

package org.lwf.auto;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class Guru99Login {
	WebDriver webDriver;
	By gurn99UserNmae = By.name("uid");
	By gurn99Password = By.name("password");
	By gurn99Titletext = By.className("barone");
	By login = By.name("btnLogin");
	
	
//	初始化浏览器
	public Guru99Login(WebDriver webDriver) {
		this.webDriver = webDriver;
	}
	
	
//	设置UserName
	public void setUserName(String strUserName){
		System.out.println("find userName method invoke");
		webDriver.findElement(gurn99UserNmae).sendKeys(strUserName);
	}
	
//	设置密码
	public void setPassword(String strPassword){
		webDriver.findElement(gurn99Password).sendKeys(strPassword);
	}
	
//	点击登录按键
	public void clickLogin(){
		webDriver.findElement(login).click();
	}
	
	
//	获取title
	public String getLoginTitle(){
//		return webDriver.findElement(gurn99Titletext).getText();
		return webDriver.getTitle();
	} 
	
	
	
//	登录
	public void loginToGun99(String username, String password){
		this.setUserName(username);
		this.setPassword(password);
		this.clickLogin();
	}
	
	void quitBrower(){
		webDriver.quit();
	}
}  

测试用例

package org.lwf.auto;

import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class TestGrun99Login {
	private static Logger logger = Logger.getLogger(TestGrun99Login.class);    
	WebDriver webDriver;
	Guru99Login loginPage;
	Guru99HomePage homePage;

	@BeforeTest
	public void setUpTest(){
		System.setProperty("webdriver.chrome.driver", "C:\Users\ikan\Downloads\chromedriver_win32\chromedriver.exe");
		webDriver = new ChromeDriver();
		webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
		webDriver.get("http://demo.guru99.com/V4/");
	}
	@Test
	public void testLoginGun99(){
		Guru99Login login = new Guru99Login(webDriver);
		login.loginToGun99("mgr123", "mgr!23");
		logger.debug("Current Page Title is"+login.getLoginTitle());
		login.quitBrower();
	}
	
	
	
}

 以下是pom使用pagefactory优化方法

package org.lwf.auto;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class FactoryGurnLogin {

	/**
	 * Page Factory 是selenium WebDriver的内置页面对象模型概念,但他已经经过优化 页面对象存储库和对象方法分离,
	 * 在PageFactory类的帮助下,我们使用@FindBy注释来查找WebElment,
	 * 我们使用initElement方式初始化web元素 @FindBy可以接受tagName,partialLinkText,name,
	 * linkText,id,css,className,xpath作为属性。
	 */

	WebDriver driver;
	@FindBy(name = "uid")
	WebElement grun99userName;

	@FindBy(name = "password")
	WebElement grun99passWord;

	@FindBy(name="btnLogin")
	WebElement grun99login;

	public FactoryGurnLogin(WebDriver driver) {
		super();
		this.driver = driver;
		PageFactory.initElements(driver, this);
	}

	public void setUserName(String userNmae) {
		grun99userName.sendKeys(userNmae);
	}

	public void setPassWord(String passWord) {
		grun99passWord.sendKeys(passWord);
	}
	
	public void clickLogin(){
		this.grun99login.click(); 
	}
	
	public String currentPageTitle(){
		return driver.getTitle();
	}
	
	public void closeBrower(){
		driver.close();
	}
	
	public void loginToGuru99(String userName, String passWord){
		this.setUserName(userName);
		this.setPassWord(passWord);
		this.clickLogin();
	}
	
}

 测试用例

package org.lwf.auto;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class Test99GurnLoginWithPageFactory {
	
	
	
	
	WebDriver webDriver;
	FactoryGurnLogin factoryGurnLogin;
	
	@BeforeTest
	public void beforeTest(){
		System.setProperty("webdriver.chrome.driver", "C:\Users\ikan\Downloads\chromedriver_win32\chromedriver.exe");
		webDriver = new ChromeDriver();
		webDriver.get("http://demo.guru99.com/V4/");
	}
	
	@Test
	public void test1(){
		factoryGurnLogin = new FactoryGurnLogin(webDriver);
		String title = factoryGurnLogin.currentPageTitle();
		System.out.println(title);
		factoryGurnLogin.loginToGuru99("mgr123", "mgr!23");
		String title2 = factoryGurnLogin.currentPageTitle();
		Assert.assertEquals(title, title2);
	}
	
	
	
}

 GitHub地址:https://github.com/SailFan/auto

 实在没啥写的, 还不如记下这个地址, 什么不会搂一眼就行了, 但是挺烦的是现在的有些2 13 , 问的时候总喜欢问你几个不知道的方法, 然后别人回答不上来就感觉自己很牛逼的样子, 这种人啊, *************************************************************

https://www.guru99.com/upload-download-file-selenium-webdriver.html, 瞅瞅 人家写的多专业

原文地址:https://www.cnblogs.com/sailfan/p/10931485.html