UI“三重天”之selenium--封装(二)
基础示例代码:
/** * @author Richered **/ package com.sample; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class TestBaidu { public static WebDriver driver = null; public static void main(String[] args) throws InterruptedException{ System.setProperty("webdriver.chrome.driver", "tools/chromedriver.exe"); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://www.baidu.com"); Thread.sleep(2000); driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("桃李不言、下自成蹊 博客园"); Thread.sleep(5000); // driver.findElement(By.xpath("//*[@id=\"su\"]")).click(); driver.close(); } }
本例基本上和官方示例代码一般无二,首先是获取浏览器driver,打开浏览器,将浏览器最大化,进入baidu,等待2s,找到百度输入框并传值"桃李不言、下自成蹊 博客园",等待5s,关闭浏览器。
代码都是被写死的,例如这块不想使用google浏览器,想使用firefox浏览器或者IE浏览器呢?不想将浏览器窗口最大化呢?想进入www.bing.com呢?不想使用xpath的定位方式呢?
问题抛出来了,这样写代码的方式也着实僵硬,那么如何解决呢?--封装关键字、动作
封装
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是
将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。(copy百度百科)
其实讲的通俗一点就是:封装提高了代码的重用性,不用关心具体的实现,当然,封装也是面向对象的三大特征之一。
看看封装上方的代码是如何实现:
/** * @author Richered **/ package com.sample; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class KeyWord { public WebDriver driver; public KeyWord() { } //选择浏览器 public void openBrowser(String browserType) { try { switch (browserType) { case "chrome": GoogleDriver chrome = new GoogleDriver("tools/chromedriver.exe"); driver = chrome.getdriver(); break; case "ff": FFDriver firefox = new FFDriver("F:\\Firefox\\firefox.exe", "tools/geckodriver.exe"); driver = firefox.getdriver(); break; default: GoogleDriver c = new GoogleDriver("tools/chromedriver.exe"); driver = c.getdriver(); break; } } catch (Exception e) { // TODO: handle exception } } //关闭浏览器 public void closeBrowser() { try { driver.quit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("关闭浏览器出错!"); } } //浏览器大小显示 public void setWindow(){ driver.manage().window().maximize(); } //访问网站 public void getURL(String url) { try { driver.get(url); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //封装name定位元素并传值 public void inputByNameAndSubmit(String name,String content) { try { driver.findElement(By.name(name)).sendKeys(content); driver.findElement(By.name(name)).submit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //封装id定位元素并传值 public void inputById(String id, String content) { try { driver.findElement(By.id(id)).sendKeys(content); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //用xpath定位元素并传值 public void inputByxpath(String xpath, String content) { try { driver.findElement(By.xpath(xpath)).sendKeys(content); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /***********************************************************/ //用id定位元素并点击 public void clickByid(String id) { try { driver.findElement(By.id(id)).click(); } catch (Exception e) { // TODO: handle exception } } //用name定位元素并点击 public void clickByname(String name) { try { driver.findElement(By.name(name)).click(); } catch (Exception e) { // TODO: handle exception } } //用xpath定位元素并点击 public void clickByxpath(String xpath) { try { driver.findElement(By.xpath(xpath)).click(); } catch (Exception e) { // TODO: handle exception } } /***********************************************************/ //选择点击方法 public void clickSwitch(String method, String phase) { try { switch (method) { case "id": driver.findElement(By.id(phase)).click(); break; case "classname": driver.findElement(By.className(phase)).click(); break; case "name": driver.findElement(By.name(phase)).click(); break; case "tagname": driver.findElement(By.tagName(phase)).click(); break; case "linktext": driver.findElement(By.linkText(phase)).click(); break; case "partialLinktext": driver.findElement(By.partialLinkText(phase)).click(); break; case "xpath": driver.findElement(By.xpath(phase)).click(); break; case "css": driver.findElement(By.cssSelector(phase)).click(); break; default: driver.findElement(By.xpath(phase)).click(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //封装强制等待 public void halt(String time) { int t = 1000; try { t = Integer.parseInt(time); Thread.sleep(t); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
注释里边写的很清楚了,此处封装了选择浏览器,关闭浏览器,访问URL,name、id、xpath的定位元素(传值)方式【当然可以增加其他的定位方式,下同】,name、id、xpath的定位元素并点击,选择点击方法,等待。
同样是上方示例代码的目的,再看实现方式:
/** * @author Richered **/ package com.sample; public class TestBaidu { public static void main(String[] args) { KeyWord sm = new KeyWord(); sm.openBrowser("chrome"); sm.setWindow(); sm.getURL("https://www.baidu.com"); sm.halt("2000"); sm.inputByxpath("//*[@id=\"kw\"]", "桃李不言、下自成蹊 博客园"); sm.halt("5000"); sm.closeBrowser(); } }
嗯哼,是不是代码量简洁了许多呢?选择哪个浏览器可以灵活选择;定位元素的方式被单独伶了出来,传值即可;动作也被伶了出来,当然等待方式等等关键字、动作都可以进行封装。
后续~~~~~