Selenium的简单操作

简介:

目录

1引入jar包链接驱动,打开浏览器

2常用Webderver对象方法

3定位元素

4对页面元素进行操作

5iframe处理

6获得弹出窗口

7处理alert、confirm、prompt对话框

8操作cookies

9等待页面元素加载完成

10利用selenium-webdriver截图

背景

之 所以要学习selenium,是因为最近接到一项工作任务,爬取支付宝登录用户的数据,支付宝依然是通过cookie中的信息记录用户的状态,所以我只需 要获取支付宝完整的cookie就可以横行霸道,但这丫的反爬机制做的非常变态,在登录的过程中有大量的js计算以及js跳转,且在跳转的过程中创建 cookie,导致我获取的cookie不完全,被支付宝给拒绝访问,最后通过selenium模拟浏览器登录的方式解决

1引入jar包链接驱动,打开浏览器

(1)引入依赖

      < dependency >
           < groupId >org.seleniumhq.selenium</ groupId >
           < artifactId >selenium-java</ artifactId >
           < version >2.53.0</ version >
           <!-- 对应火狐45.0.1版本 -->
           <!-- 对应chrome48至51版本 -->
       </ dependency >
       
       <!-- apache工具包 -->
     < dependency >
         < groupId >org.apache.commons</ groupId >
         < artifactId >commons-lang3</ artifactId >
         < version >3.4</ version >
     </ dependency >

(2)创建不同版本的驱动,打开对应的浏览器,在此只介绍firefox和chrome的驱动链接,其他的如IE, HtmlUnit(无界面浏览器)等,可以查看链接http://www.51testing.com/html/05/n-2420905.html

    chrome方式 (注:此为window平台,且要保证chrome浏览器安装在默认位置

         //设置chrome的全局参数 参数1为驱动类型  参数2为驱动位置  驱动下载地址https://pan.baidu.com/s/1bpgG98F
         System.setProperty( "webdriver.chrome.driver" , "D:/software/Applications/chromedriver.exe" );
         //创建一个 ChromeDriver 的接口,用于连接 Chrome
         WebDriver webDriver= new  ChromeDriver();
         //进入百度
         webDriver.get( "http://www.baidu.com" );
 
         try  {
             //睡眠3秒
             TimeUnit.SECONDS.sleep( 3 );
         catch  (InterruptedException e) {
             e.printStackTrace();
         }
         //关闭浏览器
         webDriver.quit();

    firefox方式

         //参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
         //创建一个 FirefoxDriver 的接口,用于连接 firefox
         WebDriver webDriver= new  FirefoxDriver();
         //进入百度
         webDriver.get( "http://www.baidu.com" );
 
         try  {
             //睡眠3秒
             TimeUnit.SECONDS.sleep( 3 );
         catch  (InterruptedException e) {
             e.printStackTrace();
         }
          //关闭浏览器
         webDriver.quit();

2常用Webderver对象方法 

此处以火狐接口为例,chrome通用

         // 参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
         //创建一个 FirefoxDriver 的接口,用于连接 firefox
         WebDriver webDriver= new  FirefoxDriver();
         //(1)跳转路径→进入百度
         webDriver.get( "http://www.baidu.com" );
 
         //(2)导航路径→进入淘宝   webDriver.get()和webDriver.navigate().to()其实功能一样,只不过”get()”拼写起来更简单,
         //但是webDriver.navigate()可以控制浏览器的前进和后退
         webDriver.navigate().to( "http://www.taobao.com" );
 
         //(3)获取当前url
         String curUrl= webDriver.getCurrentUrl();
         System.out.println(curUrl); //输出为:http://www.taobao.com
 
         //(4)获取当前页面标题
         String curTitle=webDriver.getTitle();
         System.out.println(curTitle); //输出为:淘宝网 - 淘!我喜欢
 
         //(5)获取当前页面的html内容
         String curHtml=webDriver.getPageSource();
         System.out.println(curHtml); //输出太多··占位置··你们自己看吧
 
         //(6)后退一页
         webDriver.navigate().back();
 
         //(7)前进一页
         webDriver.navigate().forward();
 
         //(8)返回当前的浏览器的窗口句柄
         webDriver.getWindowHandle();
         //(9)返回当前的浏览器的所有窗口句柄
         webDriver.getWindowHandles();
 
         try  {
             //休眠3秒
             TimeUnit.SECONDS.sleep( 3 );
         catch  (InterruptedException e) {
             e.printStackTrace();
         }
         //退出浏览器
         webDriver.quit();

3定位元素

         // 参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
         //创建一个 FirefoxDriver 的接口,用于连接 firefox
         WebDriver webDriver= new  FirefoxDriver();
         //(1)跳转路径→进入本文章页面
         webDriver.get( "http://www.like666.com/2016/07/19/selenium-webdriver的简单操作说明/" );
         try  {
             //休眠3秒,等待元素加载完毕,后续有讲解其他方式等待元素加载
             TimeUnit.SECONDS.sleep( 3 );
         catch  (InterruptedException e) {
             e.printStackTrace();
         }
         //WebDriver通过findElement()和findElements()获取单个以及多个元素,通过By对象来定位元素的位置,当没有获取到元素时
         //,会引发org.openqa.selenium.NoSuchElementException异常,需要捕捉处理
 
 
         //(1)className:此时获取类样式包含'hfeed'的元素
         WebElement e1=webDriver.findElement(By.className( "hfeed" ));
         //获取该元素的id属性
         System.out.println(e1.getAttribute( "id" )); //输出为page
 
 
         //(2)id:此时获取属性id='page'的元素
         WebElement e2=webDriver.findElement(By.id( "page" ));
         //获取该元素的class属性
         System.out.println(e2.getAttribute( "class" )); //输出为hfeed site
 
         //(3)cssSelector:此时获取包含类样式为hfeed的div元素
         WebElement e3=webDriver.findElement(By.cssSelector( "div.hfeed" ));
         //获取该元素的id属性
         System.out.println(e3.getAttribute( "id" )); //输出为page
 
 
         //(4)name:获取name='generator'的元素,当有多个时,取第一个
         WebElement e4=webDriver.findElement(By.name( "generator" ));
         //获取该元素的content属性
         System.out.println(e4.getAttribute( "content" )); //输出为WordPress 4.5.3
 
 
         //(5)tagName:获取标签为script的元素,当有多个时,取第一个
         WebElement e5=webDriver.findElement(By.tagName( "script" ));
         //获取该元素的type属性
         System.out.println(e5.getAttribute( "type" )); //输出为text/javascript
 
 
         //(5)xpath:获取根元素下body元素下第一个div元素
         WebElement e6=webDriver.findElement(By.xpath( "//body/div[1]" ));
         //获取该元素的id属性
         System.out.println(e6.getAttribute( "id" )); //输出为page
 
         //退出浏览器
         webDriver.quit();

4对页面元素进行操作

         // 参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
         //创建一个 FirefoxDriver 的接口,用于连接 firefox
         WebDriver webDriver= new  FirefoxDriver();
         //跳转路径→进入本文章页面
         webDriver.get( "https://www.baidu.com/" );
         try  {
             //休眠3秒,等待元素加载完毕,后续有讲解其他方式等待元素加载
             TimeUnit.SECONDS.sleep( 3 );
 
             //(1)输入框:根据id找到输入框
             WebElement e1 =webDriver.findElement(By.id( "kw" ));
             //设值
             e1.sendKeys( "www.like666.com" );
 
             //得到设入的值
             String text=e1.getText();
             System.out.println(text);
 
             //(2)按钮:找到'百度一下'按钮
             WebElement e2 =webDriver.findElement(By.id( "su" ));
             //点击提交
             e2.click();
 
             //还有很多其他方法
             e1.clear(); //清空文本框内容,或单选项的选中项或复选框的选中项
             e1.isSelected(); //判断某个单选框,复选框,下拉框是否选中
             e1.isEnabled(); //判断某个单选框,复选框,下拉框是否启用
             e1.submit(); //提交表单  只对表单元素type为submit的标签有效果
 
             
             TimeUnit.SECONDS.sleep( 3 );
             //退出浏览器
             webDriver.quit();
         catch  (InterruptedException e) {
             e.printStackTrace();
         }

5iframe处理

有 时候我们在定位一个页面元素的时候发现一直定位不了,反复检查自己写的定位器没有任何问题,代码也没有任何问题。这时你就要看一下这个页面元素是否在一个 iframe中,这可能就是找不到的原因之一。如果你在一个default content中查找一个在iframe中的元素,那肯定是找不到的。反之你在一个iframe中查找另一个iframe元素或default content中的元素,那必然也定位不到。

selenium webdriver中提供了进入一个iframe的方法:

WebDriverorg.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)

也提供了一个返回default content的方法:

WebDriver org.openqa.selenium.WebDriver.TargetLocator.defaultContent()

这样使我们面对iframe时可以轻松应对。

以下面的html代码为例,我们看一下处现iframe。

Html代码

  main.html

< html >
    < head >
        < title >FrameTest</ title >
    </ head >
    < body >
          < div  id = "id1">this is a div!</ div >
        < iframe  id = "frame"  frameborder = "0"  scrolling = "no" style = "left:0;position:absolute;"  src ="frame.html"></ iframe >
    </ body >
</ html >

 frame.html

< html >
    < head >
        < title >this is a frame!</ title >
    </ head >
    < body >
          < div  id = "div1">this is a div,too!</ div >
          < label >input:</ label >
          < input  id = "input1"></ input >
    </ body >
</ html >

Java代码

         // 参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
 
         //将main.html和freme.html放入D盘根目录
         WebDriver webDriver =  new  FirefoxDriver();
         String url =  "D:/main.html" ;
         webDriver.get(url);
 
         //在defaultcontent定位id="id1"的div
         webDriver.findElement(By.id( "id1" ));
 
         //此时,没有进入到id="frame"的frame中时,以下两句会报错
         webDriver.findElement(By.id( "div1" )); //报错
         webDriver.findElement(By.id( "input1" )); //报错
 
         //进入id="frame"的frame中,定位id="div1"的div和id="input1"的输入框。
         webDriver.switchTo().frame( "frame" );
         webDriver.findElement(By.id( "div1" ));
         webDriver.findElement(By.id( "input1" ));
 
         //此时,没有跳出frame,如果定位defaultcontent中的元素也会报错。
         webDriver.findElement(By.id( "id1" )); //报错
 
         //跳出frame,进入defaultcontent;重新定位id="id1"的div
         webDriver.switchTo().defaultContent();
         webDriver.findElement(By.id( "id1" ));
         
         //switch_to方法会new1个TargetLocator对象,使用该对象的frame方法可以将当前识别的”主体”移动到需要定位的frame上去。

6获得弹出窗口

Html代码

< span  style = "white-space: normal;background-color: #ffffff;" >test.html</ span >
  
  
< html >
  
    < head >< title >Test Popup Window</ title ></ head >
  
    < body >
  
        < a  id = "51" href = "http://www.51.com/" target ="_blank">Let's go!</ a >
  
    </ body >
  
</ html >

Java代码

         // 参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
         WebDriver dr =  new  FirefoxDriver();
         String url = "D:/main.html" ;
         dr.get(url);
         dr.findElement(By.id( "51" )).click();
         //得到当前窗口的句柄
         String currentWindow = dr.getWindowHandle();
         //得到所有窗口的句柄
         Set<String> handles = dr.getWindowHandles();
         Iterator<String> it = handles.iterator();
         while (it.hasNext()){
             if (currentWindow== it.next())
                 continue ;
             dr.switchTo().window(it.next());
 
         }
         
          /**
          * 捕获或者说定位弹出窗口的关键在于获得弹出窗口的句柄。(
          在上面的代码里,使用windowhandle方法来获取当前浏览器窗口的句柄,使用了windowhandles方法获取所有弹出的浏览器窗口的句柄,然后通过排除当前句柄的方法来得到新开窗口的句柄。
          在获取新弹出窗口的句柄后,使用switchto.window(newwindow_handle)方法,将新窗口的句柄作为参数传入既可捕获到新窗口了。
          如果想回到以前的窗口定位元素,那么再调用1次switchto.window方法,传入之前窗口的句柄既可达到目的。
          */

7处理alert、confirm、prompt对话框


Dialogs.html  

< html >
  
    < head >
  
        < title >Alert</ title >
  
    </ head >
  
    < body >
  
        < input  id = "alert" value = "alert" type ="button" onclick = "alert('欢迎!请按确认继续!');"/>
         < input  id = "confirm" value= "confirm" type = "button" onclick = "confirm('确定吗?');"/>
          < inputid  = "prompt" value = "prompt" type = "button"onclick = "var name = prompt('请输入你的名字:','请输入
  
你的名字'); document.write(name) "/>
         
  
    </ body >
  
</ html >

Java

         // 参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
         WebDriver dr =  new  FirefoxDriver();
         String url =  "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Dialogs.html" ;// "/Your/Path/to/main.html"
         dr.get(url);
 
         //点击第一个按钮,输出对话框上面的文字,然后叉掉
         dr.findElement(By.id( "alert" )).click();
         Alert alert = dr.switchTo().alert();
         String text = alert.getText();
         System.out.println(text);
         alert.dismiss();
 
         //点击第二个按钮,输出对话框上面的文字,然后点击确认
         dr.findElement(By.id( "confirm" )).click();
         Alert confirm = dr.switchTo().alert();
         String text1 = confirm.getText();
         System.out.println(text1);
         confirm.accept();
 
         //点击第三个按钮,输入你的名字,然后点击确认,最后
         dr.findElement(By.id( "prompt" )).click();
         Alert prompt = dr.switchTo().alert();
         String text2 = prompt.getText();
         System.out.println(text2);
         prompt.sendKeys( "jarvi" );
         prompt.accept();
         
           /**
          * getText()    得到它的文本值
          accept()      相当于点击它的"确认"
          dismiss()     相当于点击"取消"或者叉掉对话框
          sendKeys() 输入值,这个alert\confirm没有对话框就不能用了,不然会报错。
          */

8操作cookies

         // 参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
         WebDriver dr =  new  FirefoxDriver();
         //进入百度
         dr.get( "https://www.baidu.com" );
 
         //增加一个name ="name",value="value"的cookie
         Cookie cookie =  new  Cookie( "name" "value" );
         dr.manage().addCookie(cookie);
 
         //得到当前页面下所有的cookies,并且输出它们的所在域、name、value、有效日期和路径
         Set<Cookie>cookies = dr.manage().getCookies();
         System.out.println(String.format( "Domain-> name -> value -> expiry -> path" ));
         for (Cookie c : cookies)
             System.out.println(String.format( "%s-> %s -> %s -> %s -> %s" ,
                     c.getDomain(),c.getName(), c.getValue(),c.getExpiry(),c.getPath()));
 
 
         //删除cookie有三种方法
 
         //第一种通过cookie的name
         dr.manage().deleteCookieNamed( "CookieName" );
         //第二种通过Cookie对象
         dr.manage().deleteCookie(cookie);
         //第三种全部删除
         dr.manage().deleteAllCookies();

9等待页面元素加载完成

        //1线程等待 但不确定元素是否在等待结束后已经加载完成,只是预估时间
         
         try  {
             TimeUnit.SECONDS.sleep( 3 );
         catch  (InterruptedException e) {
             e.printStackTrace();
         }
 
         //2隐性等待,是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.ex" );
         WebDriver dr =  new  FirefoxDriver();
 
         //设置10秒
         dr.manage().timeouts().implicitlyWait( 10 ,TimeUnit.SECONDS);

10利用selenium-webdriver截图

         // 参数1为驱动类型  参数2为火狐浏览器的安装目录  浏览器下载地址http://ftp.mozilla.org/pub/firefox/releases/45.0/
         System.setProperty( "webdriver.firefox.bin" , "D:/software/firefox45/firefox.exe" );
         //创建一个 FirefoxDriver 的接口,用于连接 firefox
         WebDriver webDriver= new  FirefoxDriver();
         //跳转路径→进入淘宝页面
         webDriver.get( "https://www.taobao.com/" );
         try  {
             TimeUnit.SECONDS.sleep( 5 );
         //下面代码是得到截图并保存在D盘下
             File screenShotFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
 
             FileUtils.copyFile(screenShotFile,  new  File( "D:/test.png" ));
 
             webDriver.quit();
         catch  (InterruptedException e) {
             e.printStackTrace();
         } catch  (IOException e) {
             e.printStackTrace();
         }

转自:http://www.like666.com/2016/07/19/selenium-webdriver%E7%9A%84%E7%AE%80%E5%8D%95%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E/  



本文转自 兴趣e族 51CTO博客,原文链接:http://blog.51cto.com/simplelife/1880279


相关文章
|
4天前
|
Web App开发 测试技术
使用Selenium模拟鼠标滚动操作的技巧
本文介绍了使用Selenium进行Web自动化测试时如何模拟鼠标滚动操作。模拟滚动对于处理动态加载的内容至关重要。通过`ActionChains`类,可以实现向下滑动1000像素的操作。示例代码展示了如何结合滚动来截取长页面的完整图片。总结来说,Selenium的`ActionChains`使得模拟用户行为,如滚动,变得简单,便于执行自动化任务。
41 0
|
4天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
【4月更文挑战第21天】本文介绍了Selenium中处理特殊测试场景的方法,如鼠标悬停。Selenium的Actions类提供了鼠标悬停功能,用于模拟用户在网页元素上的悬停行为。文中通过实例展示了如何使用Actions悬停并展开下拉菜单,以及在搜索时选择自动补全的字段。代码示例包括了打开百度首页,悬停在“更多”元素上显示下拉菜单并点击“音乐”,以及在搜索框输入关键词并自动补全的过程。
41 0
|
9月前
|
SQL Oracle 关系型数据库
selenium-简单的介绍与操作
selenium-简单的介绍与操作
88 0
|
4天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
25 0
|
1天前
|
JavaScript 前端开发 测试技术
《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
【5月更文挑战第12天】本文介绍了WebDriver中用于判断元素状态的三个方法:`isEnabled()`、`isSelected()`和`isDisplayed()`。`isSelected()`检查元素是否被选中,通常用于勾选框。`isDisplayed()`则用来判断元素是否在页面上可见。`isEnabled()`方法确定元素是否可操作,例如是否能点击或输入内容。
9 1
|
4天前
|
存储 前端开发 测试技术
《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
【4月更文挑战第27天】本文介绍了使用Java+Selenium进行Web自动化测试时,如何遍历和操作多选按钮的方法。文章分为两个部分,首先是一个本地HTML页面的示例,展示了多选按钮的HTML代码和页面效果,并详细解释了遍历多选按钮的思路:找到所有多选按钮的共同点,通过定位这些元素并放入list容器中,然后使用for循环遍历并操作。 第二部分介绍了在JQueryUI网站上的实战,给出了被测网址,展示了代码设计,同样使用了findElements()方法获取所有多选按钮并存储到list中,然后遍历并进行点击操作。最后,文章对整个过程进行了小结,并推荐了作者的其他自动化测试教程资源。
21 0
|
4天前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(三十三)-java+ selenium自动化测试-单选和多选按钮操作-上篇(详解教程)
【4月更文挑战第25天】本文介绍了自动化测试中如何处理单选和多选按钮的操作,包括它们的定义、HTML代码示例以及如何判断和操作这些元素。文章通过一个简单的HTML页面展示了单选和多选框的示例,并提供了Java+Selenium实现的代码示例,演示了如何检查单选框是否选中以及如何进行全选操作。
23 0
|
4天前
|
数据采集 前端开发 测试技术
《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。
14 2
|
4天前
|
Web App开发 数据采集 Java
《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
【4月更文挑战第22天】本文介绍了在测试过程中可能会用到的两个功能:Actions类中的拖拽操作和划取字段操作。拖拽操作包括基本讲解、项目实战、代码设计和参考代码,涉及到鼠标按住元素并将其拖动到另一个元素上或指定位置。划取字段操作则介绍了如何在一段文字中随机选取一部分,包括项目实战、代码设计和参考代码。此外,文章还提到了滑动验证的实现,并提供了相关的代码示例。
41 2
|
4天前
|
Web App开发 Java 测试技术
《手把手教你》系列技巧篇(二十六)-java+ selenium自动化测试-浏览器操作(详细教程)
【4月更文挑战第18天】本文介绍了Web自动化中的浏览器操作,包括如何打开不同类型的浏览器(如IE、Chrome、Firefox),以及进行页面操作如打开URL、浏览器最大化、刷新、前进和后退。还展示了如何设置浏览器位置和大小,以及获取当前URL和标题。此外,提供了项目实战例子,演示了如何用Selenium实现打开浏览器、设置位置和大小、搜索并执行页面操作的过程。文章最后提到一些其他可用的方法,并鼓励读者继续学习自动化测试相关知识。
51 3