谈着这个话题很大,因为我自己在自动化分层的方面做的就不是很好,最近在做java+selenium中,如果不分层去管理,代码就显得很乱,如下:
下面代码主要是做了一个登录,登录后在修改自己的一些个人信息,第一次就把最通用的查找控件的方法,写在一个方法里面,所以能看到这样的方式“getmethod.getXpath“取控件。而且登陆这个方法在另外一个方法中也要使用。这里很重复
这个代码第一眼就给人感觉很乱,而且所有内容和执行的操作,都放在一个页面中,太乱了。那我如何整理这样的代码
public class Register { static WebDriver driver=null; SeekMethod getmethod=new SeekMethod(); public String filePath = "E:\\senlenium\\Date.txt"; //Basetest testdriver=new Basetest(); @Before public void StartDriver() { System.out.println("srart selenium"); driver=new ChromeDriver(); driver.get("http://www.91testing.net"); } public void Login(String name,String password) throws InterruptedException{ driver.findElement(By.linkText("登录")).click(); System.out.printf("url of current page is %s\n", driver.getCurrentUrl()); getmethod.getId("login_username",driver).clear(); ((JavascriptExecutor)driver).executeScript("document.getElementById(‘login_username‘).value=‘"+name+"‘;"); driver.findElement(By.name("_password")).clear(); ((JavascriptExecutor)driver).executeScript("document.getElementById(‘login_password‘).value=‘"+password+"‘;"); Thread.sleep(300); driver.findElement(By.cssSelector("button[type=‘submit‘]")).click(); } @Test public void TestLogin(){ try { Login("xiaozhang","xiaozhang"); String loginassert=getmethod.getXpath(("//li[@class=‘visible-lg‘]"),driver).getText(); System.out.print(loginassert); Assert.assertEquals("我的学习",loginassert); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
解决方法:我把他分为3个类,拿登陆举例
第一个类:定义页面上所有的元素,我取名为LoginElment
package com.Method;public class LoginElment { /* * 只是定义界面的元素 */ public static String name="login_username"; public static String passWord="_password"; public static String LoginBtn="button[type=‘submit‘]"; }
第二个类:定义所有控件的操作。如查找到控件,对他进行单击,双击,填入,因为我的登录在很多地方要使用,所以我使用了单例模式
package com.Method; import org.openqa.selenium.WebDriver; public class LoginBusiness { /* * 主要实现控件的方法 * 如查找到控件 */ /* * 单例模式 */ private static LoginBusiness loginbusiness=null; public static LoginBusiness getInstance(){ if(loginbusiness==null){ loginbusiness=new LoginBusiness(); } return loginbusiness; } public void LoinTab(){ SeekMethod.getLink("登录", BaseTest.driver).click(); } public void inputUserName(String name){ SeekMethod.getId((LoginElment.name),BaseTest.driver).sendKeys(name); } public void inputPassword(String word){ SeekMethod.getName((LoginElment.passWord), BaseTest.driver).sendKeys(word); } public void clickButton(WebDriver driver){ SeekMethod.getcssSelector(LoginElment.LoginBtn, BaseTest.driver).click(); } //做断言使用 public String getmethod(){ String loginassert=SeekMethod.getXpath(("//li[@class=‘visible-lg‘]"),BaseTest.driver).getText(); return loginassert; } public void login(String userName,String pw){ SeekMethod.getLink("登录", BaseTest.driver).click(); //driver.findElement(By.linkText("登录")).click(); inputUserName(userName); inputPassword(pw); clickButton(BaseTest.driver); } }
第三个类:实现登录的方法。界面上的自动化就如同手工操作一样,每次执行就是一个操作,如下
public class Login extends BaseTest { WebDriver Driver; LoginBusiness loginbusiness; @BeforeClass public void setUp(){ loginbusiness=loginbusiness.getInstance(); }//我这里使用了testng的参数化,下面是两个参数 @Test @Parameters({"logname","password"}) public void testLogin(String logname,String password){ //第一步:打开登录界面 loginbusiness.LoinTab();//第二步:输入用户名 loginbusiness.inputUserName(logname);//第三步:输入密码 loginbusiness.inputPassword(password); //第四步:点击登录 loginbusiness.clickButton(Driver);//断言 Assert.assertEquals("我的学习",loginbusiness.getmethod()); }}
是不是看着很像功能测试一样,一步一步的执行,就这样我的login页面的脚本就算完成了,看了后,其他人员也能够一目了然,心情顿时就美丽了
时间: 2024-10-26 21:10:37