UI“三重天”之selenium--封装(二)
基础示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * @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(); } }
嗯哼,是不是代码量简洁了许多呢?选择哪个浏览器可以灵活选择;定位元素的方式被单独伶了出来,传值即可;动作也被伶了出来,当然等待方式等等关键字、动作都可以进行封装。
后续~~~~~
作者:紫陌花间客
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】