• 大屏22解决数据问题java浏览器源.docx


    大屏22解决数据问题java浏览器源.docx 

    http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe

    https://blog.csdn.net/qq_37193537/article/details/81335165

    We've Moved!

    These wiki pages are no longer maintained.

    All pages were moved to tesseract-ocr/tessdoc.

    The latest documentation is available at https://tesseract-ocr.github.io/.

    Please find this page in its new home: https://tesseract-ocr.github.io/tessdoc/Data-Files

    详解介绍Selenium常用API的使用--Java语言(完整版)

    Penny 要努力呀 2018-01-23 11:15:16  87826  收藏 384

    参考:http://www.testclass.net/selenium_java/

    一共分为二十个部分:环境安装之Java、环境安装之IntelliJ IDEA、环境安装之selenium、selenium3浏览器驱动、selenium元素定位、控制浏览器操作、WebDriver常用方法、模拟鼠标操作、模拟键盘操作、获取断言信息、设置元素等待、定位一组元素、多表单切换、多窗口切换、下拉框选择、警告框处理、文件上传、浏览器cookie操作、调用JavaScript代码、获取窗口截屏;

    (一)环境安装之Java

    1.安装java

    点击 JDK8下载,根据自己的平台,选择相应的版本进行下载。

    小知识:
    Java环境分JDK和JRE ,JDK就是Java Development Kit。简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发
    环境和运行环境。JRE是Java Runtime Enviroment是指Java的运行环境,是面向 Java 程序的使用者。

    我们以 Windows安装JDK为例,双击下载的JDK,设置安装路径。这里我选择默认安装在“D:Program FilesJavajdk1.8.0_101”目录下。
    下面设置环境变量:
    “我的电脑” 右键菜单—>属性—>高级—>环境变量—>系统变量—>新建..

    变量名: JAVA_HOME
    变量值: D:Program FilesJavajdk1.8.0_101
    变量名: CALSS_PATH
    变量值: .;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar;

    找到 path 变量名—>“编辑” 添加:

    变量名: PATH
    变量值: %JAVA_HOME%in;%JAVA_HOME%jrein;

    在Windows命令提示符(cmd)下验证 Java 是否成功:

    > java
    用法: java [-options] class [args...]
               (执行类)
       或  java [-options] -jar jarfile [args...]
               (执行 jar 文件)
    其中选项包括:
        -d32          使用 32 位数据模型 (如果可用)
        -d64          使用 64 位数据模型 (如果可用)
        -client       选择 "client" VM
        -server       选择 "server" VM
                      默认 VM 是 client.
    ......
     
     
    > javac
    用法: javac <options> <source files>
    其中, 可能的选项包括:
      -g                         生成所有调试信息
      -g:none                    不生成任何调试信息
      -g:{lines,vars,source}     只生成某些调试信息
      -nowarn                    不生成任何警告
      -verbose                   输出有关编译器正在执行的操作的消息
      -deprecation               输出使用已过时的 API 的源位置
      -classpath <路径>            指定查找用户类文件和注释处理程序的位置
    .......
    • java 命令可以运行 class 文件字节码。
    • javac 命令可以将 Java 源文件编译为 class 字节码文件。

    能读者当前下载的 Java 版本与本书不同, 但安装方法是一样的。

     

    (一)环境安装之IntelliJ IDEA

     

    1.安装IntelliJ IDEA

    你可能会问,为什么不用Eclipse呢?随着发展IntelliJ IDEA有超越Eclipse的势头,JetBrains公司的IDE基本上已经一统了各家主流编程语言的江湖。考虑到 Java IDE的流行趋势,本书中决定选用IntelliJ IDEA。
    当然, 选择什么样的IDE充满着个人喜好。你依然可以参考其它资料安装Java IDE。这不会影响你阅读该系列文章。 点击 IntelliJ IDEA下载,根据自己的平台,选择相应的版本进行下载。
    IntelliJ IDEA安装过程省略…
    如果第一次打开IntelliJ IDEA,会看到如下界面。

    点击”Create New Project”选项创建新的Java项目。选择项目类型为Java,然后,继续”Next”。

    • Project name: 项目名称。
    • Project location: 项目在硬盘上的路径。

    点击”Finish”结束项目创建完成。

    2.编写Hello World!

    首先,打开IntelliJ IDEA,点击左侧项目列表,在src下面创建类文件
    1)右键左侧项目列表 src—>New —> Package 弹出窗口, 输入包的名:javaBase。
    2)右键左侧创建的包名:java —>New —> Java Class 弹出窗口, 输入类的名:HelloWorld。

    在 HelloWorld.java 文件中编写第一个 Java 程序。

    1.  package com.java.base;
    2.   
    3.  public class HelloWorld {
    4.    public static void main(String[] args){
    5.      System.out.println("hello world");
    6.    }
    7.  }

    输入完成, 点击工具栏 Run 按钮(或在代码文件中右键选择”Run ‘HelloWorld.main()’“)运行, 将会在控制台看到“hello word” 的输出。

    (三)环境安装之Selenium

    1.通过jar包安装

    点击 Selenium下载 链接 你会看到Selenium Standalone Server的介绍:
    The Selenium Server is needed in order to run Remote Selenium WebDriver. Selenium 3.X is no longer capable of running Selenium RC directly, rather it does it through emulation and the WebDriverBackedSelenium interface.
    Download version 3.4.0
    点击版本号进行下载,下载完成将会得到一个selenium-server-standalone-3.4.0.jar文件。
    打开IntelliJ IDEA,导入.jar包。

    点击菜单栏 File –> Project Structure(快捷键Ctrl + Alt + Shift + s) ,点击 Project Structure界面左侧 的“Modules” 。在“Dependencies” 标签界面下,点击右边绿色的“+” 号,选择第一个选项“JARs or directories…” ,选择相应的 jar 包,点“OK” ,jar包添加成功。

    2.通过Maven安装

    关于Maven安装又是另一个话题了。你可以参考其它资料学习在IntelliJ IDEA创建Maven项目。

    Maven官网idea & maven helpMaven仓库

    打开pom.xml 配置Selenium。

    1.  <?xml version="1.0" encoding="UTF-8"?>
    2.  <project xmlns="http://maven.apache.org/POM/4.0.0"
    3.           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4.           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5.      <modelVersion>4.0.0</modelVersion>
    6.   
    7.      <groupId>com.mvn.demo</groupId>
    8.      <artifactId>MyMvnPro</artifactId>
    9.      <version>1.0-SNAPSHOT</version>
    10.     <build>
    11.         <plugins>
    12.             <plugin>
    13.                 <groupId>org.apache.maven.plugins</groupId>
    14.                 <artifactId>maven-compiler-plugin</artifactId>
    15.                 <configuration>
    16.                     <source>1.6</source>
    17.                     <target>1.6</target>
    18.                 </configuration>
    19.             </plugin>
    20.         </plugins>
    21.     </build>
    22.  
    23.     <dependencies>
    24.  
    25.         <!-- selenium-java -->
    26.         <dependency>
    27.             <groupId>org.seleniumhq.selenium</groupId>
    28.             <artifactId>selenium-java</artifactId>
    29.             <version>3.4.0</version>
    30.         </dependency>
    31.  
    32.     </dependencies>
    33.  
    34. </project>

    虽然,学习Maven需要增加你的学习成本,但如果你需要长期使用Java编程语言,或者想用Java来做更多事情的话,越早使用Maven越好!因为它会让的第三方包管理变得非常简单。

    3.Hello Selenium

    最后,少不了要写一个简单的Selenium Sample来验证Selenium安装是否成功,打开IntelliJ IDEA 创建一个新类Itest.java

    1.  package javaBase;
    2.   
    3.  import org.openqa.selenium.WebDriver;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.   
    6.  public class Itest {
    7.      public static void main(String[] args) {
    8.   
    9.          WebDriver driver = new ChromeDriver();
    10.         driver.get("http://www.itest.info");
    11.  
    12.         String title = driver.getTitle();
    13.         System.out.printf(title);
    14.  
    15.         driver.close();
    16.     }
    17. }

    如果执行报错,请看下一节,Selenium3浏览器驱动。

    (四)selenium3 浏览器驱动

    1.下载浏览器驱动

    当selenium升级到3.0之后,对不同的浏览器驱动进行了规范。如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动。
    各浏览器下载地址:
    Firefox浏览器驱动:geckodriver
    Chrome浏览器驱动:chromedrivertaobao备用地址
    IE浏览器驱动:IEDriverServer
    Edge浏览器驱动:MicrosoftWebDriver
    Opera浏览器驱动:operadriver
    PhantomJS浏览器驱动:phantomjs
    注:部分浏览器驱动地址。

    2.设置浏览器驱动

    设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: C:driver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。
    我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“C:driver”目录添加到Path的值中。

    3.验证浏览器驱动

    验证不同的浏览器驱动是否正常使用。

    1.  import org.openqa.selenium.chrome.ChromeDriver;
    2.  import org.openqa.selenium.firefox.FirefoxDriver;
    3.  import org.openqa.selenium.edge.EdgeDriver;
    4.  import org.openqa.selenium.ie.InternetExplorerDriver;
    5.  import org.openqa.selenium.opera.OperaDriver;
    6.  import org.openqa.selenium.phantomjs.PhantomJSDriver;
    7.   
    8.  ……
    9.   
    10. WebDriver driver = new ChromeDriver();    //Chrome浏览器
    11.  
    12. WebDriver driver = new FirefoxDriver();   //Firefox浏览器
    13.  
    14. WebDriver driver = new EdgeDriver();      //Edge浏览器
    15.  
    16. WebDriver driver = new InternetExplorerDriver();  // Internet Explorer浏览器
    17.  
    18. WebDriver driver = new OperaDriver();     //Opera浏览器
    19.  
    20. WebDriver driver = new PhantomJSDriver();   //PhantomJS
    21.  
    22. ……

    (五)selenium元素定位

    1.selenium定位方法

    Selenium提供了8种定位方式。

    • id
    • name
    • class name
    • tag name
    • link text
    • partial link text
    • xpath
    • css selector

    这8种定位方式在Java selenium中所对应的方法为:

    • findElement(By.id())
    • findElement(By.name())
    • findElement(By.className())
    • findElement(By.tagName())
    • findElement(By.linkText())
    • findElement(By.partialLinkText())
    • findElement(By.xpath())
    • findElement(By.cssSelector())

    2.定位方法的用法

    假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。

    1.  <html>
    2.    <head>
    3.    <body link="#0000cc">
    4.      <a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">
    5.      <form id="form" class="fm" name="f" action="/s">
    6.        <span class="soutu-btn"></span>
    7.          <input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">

    我们的目的是要定位input标签的输入框。

    • 通过id定位:
    • 通过name定位:
    • 通过class name定位:
    • 通过tag name定位:
    • 通过xpath定位,xpath定位有N种写法,这里列几个常用写法:
    • 通过css定位,css定位有N种写法,这里列几个常用写法:
    driver.findElement(By.id("kw"))
    driver.findElement(By.name("wd"))
    driver.findElement(By.className("s_ipt"))
    driver.findElement(By.tagName("input"))
    1. driver.findElement(By.xpath("//*[@id='kw']"))
    2. driver.findElement(By.xpath("//*[@name='wd']"))
    3. driver.findElement(By.xpath("//input[@class='s_ipt']"))
    4. driver.findElement(By.xpath("/html/body/form/span/input"))
    5. driver.findElement(By.xpath("//span[@class='soutu-btn']/input"))
    6. driver.findElement(By.xpath("//form[@id='form']/span/input"))
    7. driver.findElement(By.xpath("//input[@id='kw' and @name='wd']"))
    1. driver.findElement(By.cssSelector("#kw")
    2. driver.findElement(By.cssSelector("[name=wd]")
    3. driver.findElement(By.cssSelector(".s_ipt")
    4. driver.findElement(By.cssSelector("html > body > form > span > input")
    5. driver.findElement(By.cssSelector("span.soutu-btn> input#kw")
    6. driver.findElement(By.cssSelector("form#form > span > input")

    接下来,我们的页面上有一组文本链接。

    1.  <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
    2.  <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
    • 通过link text定位:
    • 通过partialLink text定位:
    1. driver.findElement(By.linkText("新闻")
    2. driver.findElement(By.linkText("hao123")
    1. driver.findElement(By.partialLinkText("新")
    2. driver.findElement(By.partialLinkText("hao")
    3. driver.findElement(By.partialLinkText("123")

    关于xpaht和css的定位比较复杂,请参考: xpath语法css选择器

    (六)控制浏览器操作

    1.控制浏览器窗口大小

    有时候我们希望能以某种浏览器尺寸找开,访问的页面在这种尺寸下运行。例如可以将浏览器设置成移动端大小(480* 800),然后访问移动站点,对其样式进行评估;WebDriver 提供了 manage().window().setSize()方法来设置浏览器的大小。

    • maximize() 设置浏览器最大化
    • setSize() 设置浏览器宽高
    1.  import org.openqa.selenium.Dimension;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.chrome.ChromeDriver;
    4.   
    5.   
    6.  public class Browser {
    7.    public static void main(String[] args) throws InterruptedException {
    8.   
    9.      WebDriver driver= new ChromeDriver();
    10.     driver.get("https://www.baidu.cn");
    11.  
    12.     driver.manage().window().maximize();
    13.     Thread.sleep(2000);
    14.  
    15.     driver.get("https://m.baidu.cn");
    16.     driver.manage().window().setSize(new Dimension(480, 800));
    17.     Thread.sleep(2000);
    18.  
    19.     driver.quit();
    20.   }
    21. }

    在 PC 端执行自动化测试脚本大多的情况下是希望浏览器在全屏幕模式下执行, 那么可以使用 maximize()方法使打开的浏览器全屏显示, 其用法与 setSize()相同, 但它不需要任何参数。

    2.控制浏览器后退、前进

    在使用浏览器浏览网页时,浏览器提供了后退和前进按钮,可以方便地在浏览过的网页之间切换,WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮。下面通过例子来演示这两个方法的使用。

    • back() 模拟浏览器后退按钮
    • forward() 模拟浏览器前进按钮
    1.  import org.openqa.selenium.WebDriver;
    2.  import org.openqa.selenium.chrome.ChromeDriver;
    3.  import org.openqa.selenium.By;
    4.   
    5.   
    6.  public class BrowserGo {
    7.   
    8.    public static void main(String[] args) throws InterruptedException {
    9.   
    10.     WebDriver driver = new ChromeDriver();
    11.  
    12.     //get 到百度首页
    13.     driver.get("https://www.baidu.com/");
    14.     System.out.printf("now accesss %s 
    ", driver.getCurrentUrl());
    15.     Thread.sleep(2000);
    16.  
    17.     //点击新闻链接
    18.     driver.findElement(By.linkText("新闻")).click();
    19.     System.out.printf("now accesss %s 
    ", driver.getCurrentUrl());
    20.     Thread.sleep(2000);
    21.  
    22.     //执行浏览器后退
    23.     driver.navigate().back();
    24.     System.out.printf("back to %s 
    ", driver.getCurrentUrl());
    25.     Thread.sleep(2000);
    26.  
    27.     //执行浏览器前面
    28.     driver.navigate().forward();
    29.     System.out.printf("forward to %s 
    ", driver.getCurrentUrl());
    30.     Thread.sleep(2000);
    31.  
    32.     driver.quit();
    33.   }
    34. }

    为了看清脚本的执行过程,下面每操作一步都通过printf()方法来打印当前的URL地址。

    3.刷新页面

    有时候需要手动刷新(F5) 页面。

    • refresh() 刷新页面(F5)
    1.  ……
    2.  //刷新页面
    3.  driver.navigate().refresh();
    4.  ……

    (七)WebDriver常用方法

    前面我们已经学习了定位元素, 定位只是第一步, 定位之后需要对这个元素进行操作, 或单击(按钮) 或 输入(输入框) , 下面就来认识这些最常用的方法。 

    1.WebDriver 常用方法

    下面先来认识 WebDriver 中最常用的几个方法:

    • clear() 清除文本。
    • sendKeys(*value) 模拟按键输入。
    • click() 单击元素
    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.WebElement;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.   
    6.  public class BaiduDemo {
    7.   
    8.    public static void main(String[] args) {
    9.   
    10.     WebDriver driver = new ChromeDriver();
    11.     driver.get("https://www.baidu.com/");
    12.  
    13.     WebElement search_text = driver.findElement(By.id("kw"));
    14.     WebElement search_button = driver.findElement(By.id("su"));
    15.  
    16.     search_text.sendKeys("Java");
    17.     search_text.clear();
    18.     search_text.sendKeys("Selenium");
    19.     search_button.click();
    20.  
    21.     driver.quit();
    22.   }
    23. }

    clear()方法用于清除文本输入框中的内容。
    sendKeys()方法模拟键盘向输入框里输入内容。 但是它的作用不仅于此, 我们还可以用它发送键盘按键, 甚至用它来指定上传的文件。
    click()方法可以用来单击一个元素,前提是它是可以被单击的对象,它与 sendKeys()方法是Web页面操作中最常用到的两个方法。 其实click()方法不仅仅用于单击一个按钮,它还可以单击任何可以单击的文字/图片链接、复选框、单选框、下拉框等。

    2.其它常用方法

    • submit()

    submit()方法用于提交表单。 例如,在搜索框输入关键字之后的“回车” 操作, 就可以通过 submit()方法模拟.

    1.  ……
    2.  WebElement search_text = driver.findElement(By.id("kw"));
    3.  search_text.sendKeys("Selenium");
    4.  search_text.submit();
    5.  ……
    • getSize() 返回元素的尺寸。
    • getText() 获取元素的文本。
    • getAttribute(name) 获得属性值。
    • isDisplayed() 设置该元素是否用户可见。
    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.WebElement;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.   
    6.  public class BaiduDemo {
    7.   
    8.    public static void main(String[] args) {
    9.   
    10.     WebDriver driver = new ChromeDriver();
    11.     driver.get("https://www.baidu.com/");
    12.  
    13.     //获得百度输入框的尺寸
    14.     WebElement size = driver.findElement(By.id("kw"));
    15.     System.out.println(size.getSize());
    16.  
    17.     //返回百度页面底部备案信息
    18.     WebElement text = driver.findElement(By.id("cp"));
    19.     System.out.println(text.getText());
    20.  
    21.     //返回元素的属性值,可以是 id name type 或元素拥有的其它任意属性
    22.     WebElement ty = driver.findElement(By.id("kw"));
    23.     System.out.println(ty.getAttribute("type"));
    24.  
    25.     //返回元素的结果是否可见,返回结果为 True  False
    26.     WebElement display = driver.findElement(By.id("kw"));
    27.     System.out.println(display.isDisplayed());
    28.  
    29.     driver.quit();
    30.   }
    31. }

    打印结果:

    1.  (500, 22)
    2.  ©2017 Baidu 使用百度前必读 意见反馈 京 ICP 证 030173 号 京公网安备 11000002000001 号
    3.  text
    4.  true

    (八)模拟鼠标操作

    通过前面例子了解到,可以使用click()来模拟鼠标的单击操作,现在的Web产品中提供了更丰富的鼠标交互方式, 例如鼠标右击、双击、悬停、甚至是鼠标拖动等功能。在WebDriver中,将这些关于鼠标操作的方法封装在ActionChains类提供。
    Actions 类提供了鼠标操作的常用方法:

    • contextClick() 右击
    • clickAndHold() 鼠标点击并控制
    • doubleClick() 双击
    • dragAndDrop() 拖动
    • release() 释放鼠标
    • perform() 执行所有Actions中存储的行为

    百度首页设置悬停下拉菜单。

    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.WebElement;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.  import org.openqa.selenium.interactions.Actions;
    6.   
    7.  public class MouseDemo {
    8.   
    9.    public static void main(String[] args) {
    10.  
    11.     WebDriver driver = new ChromeDriver();
    12.     driver.get("https://www.baidu.com/");
    13.  
    14.     WebElement search_setting = driver.findElement(By.linkText("设置"));
    15.     Actions action = new Actions(driver);
    16.     action.clickAndHold(search_setting).perform();
    17.  
    18.     driver.quit();
    19.   }
    20. }
    • import org.openqa.selenium.interactions.Actions;

    导入提供鼠标操作的 ActionChains 类

    • Actions(driver) 调用Actions()类,将浏览器驱动driver作为参数传入。
    • clickAndHold() 方法用于模拟鼠标悬停操作, 在调用时需要指定元素定位。
    • perform() 执行所有ActionChains中存储的行为, 可以理解成是对整个操作的提交动作。

    1.关于鼠标操作的其它方法

    1.  import org.openqa.selenium.interactions.Actions;
    2.  ……
    3.   
    4.  Actions action = new Actions(driver);
    5.   
    6.  // 鼠标右键点击指定的元素
    7.  action.contextClick(driver.findElement(By.id("element"))).perform();
    8.   
    9.  // 鼠标右键点击指定的元素
    10. action.doubleClick(driver.findElement(By.id("element"))).perform();
    11.  
    12. // 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置。
    13. WebElement source = driver.findElement(By.name("element"));
    14. WebElement target = driver.findElement(By.name("element"));
    15. action.dragAndDrop(source,target).perform();
    16.  
    17. // 释放鼠标
    18. action.release().perform();

    (九)模拟键盘操作

    Keys()类提供了键盘上几乎所有按键的方法。 前面了解到, sendKeys()方法可以用来模拟键盘输入, 除此之 外, 我们还可以用它来输入键盘上的按键, 甚至是组合键, 如 Ctrl+A、 Ctrl+C 等。

    1.  import org.openqa.selenium.WebElement;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.chrome.ChromeDriver;
    4.  import org.openqa.selenium.By;
    5.  import org.openqa.selenium.Keys;
    6.   
    7.  public class Keyboard {
    8.   
    9.    public static void main(String[] args)throws InterruptedException {
    10.  
    11.     WebDriver driver = new ChromeDriver();
    12.     driver.get("https://www.baidu.com");
    13.  
    14.     WebElement input = driver.findElement(By.id("kw"));
    15.  
    16.     //输入框输入内容
    17.     input.sendKeys("seleniumm");
    18.     Thread.sleep(2000);
    19.  
    20.     //删除多输入的一个 m
    21.     input.sendKeys(Keys.BACK_SPACE);
    22.     Thread.sleep(2000);
    23.  
    24.     //输入空格键+“教程
    25.     input.sendKeys(Keys.SPACE);
    26.     input.sendKeys("教程");
    27.     Thread.sleep(2000);
    28.  
    29.     //ctrl+a 全选输入框内容
    30.     input.sendKeys(Keys.CONTROL,"a");
    31.     Thread.sleep(2000);
    32.  
    33.     //ctrl+x 剪切输入框内容
    34.     input.sendKeys(Keys.CONTROL,"x");
    35.     Thread.sleep(2000);
    36.  
    37.     //ctrl+v 粘贴内容到输入框
    38.     input.sendKeys(Keys.CONTROL,"v");
    39.     Thread.sleep(2000);
    40.  
    41.     //通过回车键盘来代替点击操作
    42.     input.sendKeys(Keys.ENTER);
    43.     Thread.sleep(2000);
    44.  
    45.     driver.quit();
    46.   }
    47. }

    需要说明的是,上面的脚本没有什么实际意义,但向我们展示了模拟键盘各种按键与组合键的用法。

    • import org.openqa.selenium.Keys;

    在使用键盘按键方法前需要先导入 keys 类。

    以下为常用的键盘操作:
    sendKeys(Keys.BACK_SPACE) 回格键(BackSpace)
    sendKeys(Keys.SPACE) 空格键(Space)
    sendKeys(Keys.TAB) 制表键(Tab)
    sendKeys(Keys.ESCAPE) 回退键(Esc)
    sendKeys(Keys.ENTER) 回车键(Enter)
    sendKeys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
    sendKeys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
    sendKeys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
    sendKeys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
    sendKeys(Keys.F1) 键盘 F1
    ……
    sendKeys(Keys.F12) 键盘 F12

    (十)获取断言信息

    不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。
    我们通常可以通过获取title 、URL和text等信息进行断言。text方法在前面已经讲过,它用于获取标签对之间的文本信息。

    • getTitle(): 用于获得当前页面的title。
    • getCurrentUrl() : 用户获得当前页面的URL。
    • getText() 获取页面文本信息。

    下面同样以百度为例,介绍如何获取这些信息。

    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.Keys;
    3.  import org.openqa.selenium.WebDriver;
    4.  import org.openqa.selenium.WebElement;
    5.  import org.openqa.selenium.chrome.ChromeDriver;
    6.   
    7.   
    8.  public class AssertDemo {
    9.   
    10.   public static void main(String[] args) throws InterruptedException {
    11.  
    12.       WebDriver driver = new ChromeDriver();
    13.       driver.get("https://www.baidu.com");
    14.  
    15.       System.out.println("Search before================");
    16.  
    17.       //获取当前的 title  url
    18.       System.out.printf("title of current page is %s
    ", driver.getTitle());
    19.       System.out.printf("url of current page is %s
    ", driver.getCurrentUrl());
    20.  
    21.       //百度搜索
    22.       WebElement search = driver.findElement(By.id("kw"));
    23.       search.sendKeys("Selenium");
    24.       search.sendKeys(Keys.ENTER);
    25.       Thread.sleep(2000);
    26.  
    27.       System.out.println("Search after================");
    28.  
    29.       //获取当前的 title  url
    30.       System.out.printf("title of current page is %s
    ", driver.getTitle());
    31.       System.out.printf("url of current page is %s
    ", driver.getCurrentUrl());
    32.  
    33.       //获取第一条搜索结果的标题
    34.       WebElement result = driver.findElement(By.xpath("//div[@id='content_left']/div/h3/a"));
    35.       System.out.println(result.getText());
    36.  
    37.       driver.quit();
    38.   }
    39. }

    打印结果:

    1.  Search before================
    2.  title of current page is 百度一下, 你就知道
    3.  url of current page is https://www.baidu.com/
    4.   
    5.  Search after================
    6.  title of current page is Selenium_百度搜索
    7.  url of current page is
    8.  https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=Selenium&rsv_pq=9be
    9.  4680700a485c1&rsv_t=e925U%2F%2B9SBTqmRI%2BuARg0%2BTCzrrZWn4jOBJkb1OS2vUjMrZsq5VblQ7toD8
    10. &rqlang=cn&rsv_enter=1&rsv_sug3=8&rsv_sug2=0&inputT=155&rsv_sug4=155
    11. Selenium - Web Browser Automation

    (十一)设置元素等待

    WebDriver提供了两种类型的等待:显式等待和隐式等待。

    1.显示等待

    WebDriver提供了显式等待方法,专门针对某个元素进行等待判断。

    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.WebElement;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.  import org.openqa.selenium.support.ui.WebDriverWait;
    6.  import org.openqa.selenium.support.ui.ExpectedCondition;
    7.   
    8.   
    9.  public class TimeOut01 {
    10.  
    11.   public static void main(String[]args) throws InterruptedException {
    12.  
    13.     WebDriver driver = new ChromeDriver();
    14.     driver.get("https://www.baidu.com");
    15.  
    16.     //显式等待,针对某个元素等待
    17.     WebDriverWait wait = new WebDriverWait(driver,10,1);
    18.  
    19.     wait.until(new ExpectedCondition<WebElement>(){
    20.       @Override
    21.       public WebElement apply(WebDriver text) {
    22.             return text.findElement(By.id("kw"));
    23.           }
    24.     }).sendKeys("selenium");
    25.  
    26.     driver.findElement(By.id("su")).click();
    27.     Thread.sleep(2000);
    28.  
    29.     driver.quit();
    30.   }
    31. }

    WebDriverWait类是由WebDirver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
    WebDriverWait(driver, 10, 1)
    driver: 浏览器驱动。 10: 最长超时时间, 默认以秒为单位。 1: 检测的的间隔(步长) 时间, 默认为 0.5s。

    2.隐式等待

    WebDriver 提供了几种方法来等待元素。

    • implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
    • setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
    • pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常。
    1.  import org.openqa.selenium.chrome.ChromeDriver;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.By;
    4.  import java.util.concurrent.TimeUnit;
    5.   
    6.  public class TimeOut02 {
    7.   
    8.    public static void main(String[] args){
    9.   
    10.     WebDriver driver = new ChromeDriver();
    11.  
    12.     //页面加载超时时间设置为 5s
    13.     driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
    14.     driver.get("https://www.baidu.com/");
    15.  
    16.     //定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常
    17.     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    18.     driver.findElement(By.id("kw")).sendKeys("selenium");
    19.  
    20.     //异步脚本的超时时间设置成 3s
    21.     driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
    22.  
    23.     driver.quit();
    24.   }
    25. }

    (十二)定位一组元素

    在第(五)节我们已经学习了8种定位方法, 那8种定位方法是针对单个元素定位的, WebDriver还提供了另外8种用于定位一组元素的方法。

    1.  import org.openqa.selenium.By;
    2.  ......
    3.  findElements(By.id())
    4.  findElements(By.name())
    5.  findElements(By.className())
    6.  findElements(By.tagName())
    7.  findElements(By.linkText())
    8.  findElements(By.partialLinkText())
    9.  findElements(By.xpath())
    10. findElements(By.cssSelector())

    定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词 findElement 后面多了一个 s 表示复数。

    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.WebElement;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.  import java.util.List;
    6.   
    7.   
    8.  public class ElementsDemo {
    9.   
    10.   public static void main(String[] args) throws InterruptedException {
    11.  
    12.     WebDriver driver = new ChromeDriver();
    13.     driver.get("https://www.baidu.com/");
    14.  
    15.     WebElement search_text = driver.findElement(By.id("kw"));
    16.     search_text.sendKeys("selenium");
    17.     search_text.submit();
    18.     Thread.sleep(2000);
    19.  
    20.     //匹配第一页搜索结果的标题,循环打印
    21.     List<WebElement> search_result = driver.findElements(By.xpath("//div/div/h3"));
    22.  
    23.     //打印元素的个数
    24.     System.out.println(search_result.size());
    25.  
    26.     // 循环打印搜索结果的标题
    27.     for(WebElement result : search_result){
    28.         System.out.println(result.getText());
    29.     }
    30.  
    31.     System.out.println("-------我是分割线---------");
    32.  
    33.     //打印第n结果的标题
    34.     WebElement text = search_result.get(search_result.size() - 10);
    35.     System.out.println(text.getText());
    36.  
    37.     driver.quit();
    38.   }
    39. }

    打印结果:

    1.  15
    2.  selenium java 教程-90 天从入门到高薪「学习必看」
    3.  python selenium 视频-90 天从入门到高薪「学习必看」
    4.  Selenium - Web Browser Automation
    5.  功能自动化测试工具——Selenium 篇
    6.  Selenium Documentation — Selenium Documentation
    7.  selenium + python 自动化测试环境搭建 - 虫师 - 博客园
    8.  selenium_百度翻译
    9.  Selenium_百度百科
    10. 怎样开始用 selenium 进行自动化测试(个人总结)_百度经验
    11. Selenium 官网教程_selenium 自动化测试实践_Selenium_领测软件测试网
    12. Selenium - 开源中国社区
    13. selenium 是什么?_百度知道
    14. selenium-0 基础入学, 先就业后付款!
    15. selenium, 亚马逊官网, 正品低价, 货到付款!
    16. selenium java 教程-90 天从入门到高薪「学习必看」
    17. -------我是分割线---------
    18. selenium + python 自动化测试环境搭建 - 虫师 - 博客园

    (十三)多表单切换

    在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用, WebDriver 只能在一个页面上对元素识别与 定位, 对于 frame/iframe 表单内嵌页面上的元素无法直接定位。 这时就需要通过 switchTo().frame()方法将当前定 位的主体切换为 frame/iframe 表单的内嵌页面中。

    1.  <html>
    2.    <body>
    3.      ...
    4.      <iframe id="x-URS-iframe" ...>
    5.        <html>
    6.           <body>
    7.             ...
    8.             <input name="email" >

    126邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。

    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.WebElement;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.   
    6.   
    7.  public class MailLogin {
    8.   
    9.    public static void main(String[] args){
    10.  
    11.     WebDriver driver = new ChromeDriver();
    12.     driver.get("http://www.126.com");
    13.  
    14.     WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));
    15.     driver.switchTo().frame(xf);
    16.     driver.findElement(By.name("email")).clear();
    17.     driver.findElement(By.name("email")).sendKeys("username");
    18.     driver.findElement(By.name("password")).clear();
    19.     driver.findElement(By.name("password")).sendKeys("password");
    20.     driver.findElement(By.id("dologin")).click();
    21.     driver.switchTo().defaultContent();
    22.     //……
    23.   }
    24. }

    如果完成了在当前表单上的操作,则可以通过switchTo().defaultContent()方法跳出表单。

    (十四)多窗口切换

    在页面操作过程中有时候点击某个链接会弹出新的窗口, 这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switchTo().window()方法可以实现在不同的窗口之间切换。
    以百度首页和百度注册页为例,在两个窗口之间的切换如下图。

    实现窗口切换的代码如下:

    1.  import java.util.Set;
    2.  import org.openqa.selenium.By;
    3.  import org.openqa.selenium.WebDriver;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.   
    6.  public class MoreWindows {
    7.   
    8.    public static void main(String[] arge) throws InterruptedException{
    9.   
    10.     WebDriver driver = new ChromeDriver();
    11.     driver.get("https://www.baidu.com");
    12.  
    13.     //获得当前窗口句柄
    14.     String search_handle = driver.getWindowHandle();
    15.  
    16.     //打开百度注册窗口
    17.     driver.findElement(By.linkText("登录")).click();
    18.     Thread.sleep(3000);
    19.     driver.findElement(By.linkText("立即注册")).click();
    20.  
    21.     //获得所有窗口句柄
    22.     Set<String> handles = driver.getWindowHandles();
    23.  
    24.     //判断是否为注册窗口,并操作注册窗口上的元素
    25.     for(String handle : handles){
    26.       if (handle.equals(search_handle)==false){
    27.         //切换到注册页面
    28.         driver.switchTo().window(handle);
    29.         System.out.println("now register window!");
    30.         Thread.sleep(2000);
    31.         driver.findElement(By.name("userName")).clear();
    32.         driver.findElement(By.name("userName")).sendKeys("user name");
    33.         driver.findElement(By.name("phone")).clear();
    34.         driver.findElement(By.name("phone")).sendKeys("phone number");
    35.         //......
    36.         Thread.sleep(2000);
    37.         //关闭当前窗口
    38.         driver.close();
    39.       }
    40.     }
    41.     Thread.sleep(2000);
    42.  
    43.     driver.quit();
    44.   }
    45. }

    在本例中所涉及的新方法如下:

    • getWindowHandle(): 获得当前窗口句柄。
    • getWindowHandles(): 返回的所有窗口的句柄到当前会话。
    • switchTo().window(): 用于切换到相应的窗口,与上一节的switchTo().frame()类似,前者用于不同窗口的切换, 后者用于不同表单之间的切换。

    (十五)下拉框选择

    有时我们会碰到下拉框,WebDriver提供了Select类来处理下接框。
    如百度搜索设置的下拉框,如下图:


    搜索下拉框实现代码如下:

    1.  <select id="nr" name="NR">
    2.    <option value="10" selected>每页显示 10 条</option>
    3.    <option value="20">每页显示 20 条</option>
    4.    <option value="50">每页显示 50 条</option>
    5.  <select>

    操作下接框代码如下:

    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.WebElement;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.  import org.openqa.selenium.support.ui.Select;
    6.   
    7.   
    8.  public class SelectDemo {
    9.   
    10.   public static void main(String[] args) throws InterruptedException {
    11.  
    12.     WebDriver driver = new ChromeDriver();
    13.     driver.get("https://www.baidu.com");
    14.  
    15.     driver.findElement(By.linkText("设置")).click();
    16.     driver.findElement(By.linkText("搜索设置")).click();
    17.     Thread.sleep(2000);
    18.  
    19.     //<select>标签的下拉框选择
    20.     WebElement el = driver.findElement(By.xpath("//select"));
    21.     Select sel = new Select(el);
    22.     sel.selectByValue("20");
    23.     Thread.sleep(2000);
    24.  
    25.     driver.quit();
    26.   }
    27. }

    Select类用于定位select标签。 selectByValue()方法符用于选取<option>标签的value值。

    (十六)警告框处理

    在 WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用switch_to_alert()方法定位到alert/confirm/prompt,然后使用text/accept/dismiss/sendKeys等方法进行操作。

    • getText(): 返回 alert/confirm/prompt 中的文字信息。
    • accept(): 接受现有警告框。
    • dismiss(): 解散现有警告框。
    • sendKeys(keysToSend): 发送文本至警告框。
    • keysToSend: 将文本发送至警告框。

    如下图,百度搜索设置弹出的窗口是不能通过前端工具对其进行定位的,这个时候就可以通过switchTo().alert()方法接受这个弹窗。

    接受一个警告框的代码如下:

    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.chrome.ChromeDriver;
    4.   
    5.   
    6.  public class AlertDemo {
    7.   
    8.    public static void main(String[] args) throws InterruptedException {
    9.   
    10.     WebDriver driver = new ChromeDriver();
    11.     driver.get("https://www.baidu.com");
    12.  
    13.     driver.findElement(By.linkText("设置")).click();
    14.     driver.findElement(By.linkText("搜索设置")).click();
    15.     Thread.sleep(2000);
    16.  
    17.     //保存设置
    18.     driver.findElement(By.className("prefpanelgo")).click();
    19.  
    20.     //接收弹窗
    21.     driver.switchTo().alert().accept();
    22.     Thread.sleep(2000);
    23.  
    24.     driver.quit();
    25.   }
    26. }

    (十七)文件上传

    对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过sendKeys()指定本地文件路径的方式实现文件上传。
    创建upfile.html文件,代码如下:

    1.  <html>
    2.  <head>
    3.  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    4.  <title>upload_file</title>
    5.  <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
    6.  </head>
    7.  <body>
    8.    <div class="row-fluid">
    9.    <div class="span6 well">
    10.   <h3>upload_file</h3>
    11.     <input type="file" name="file" />
    12.   </div>
    13.   </div>
    14. </body>
    15. <script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></scrip>
    16. </html>

    通过浏览器打开upfile.html文件,功能如下图。

    接下来通过sendKeys()方法来实现文件上传。

    1.  import java.io.File;
    2.  import org.openqa.selenium.By;
    3.  import org.openqa.selenium.WebDriver;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.   
    6.   
    7.  public class UpFileDemo {
    8.   
    9.    public static void main(String[] args) throws InterruptedException {
    10.  
    11.     WebDriver driver = new ChromeDriver();
    12.     File file = new File("./HTMLFile/upfile.html");
    13.     String filePath = file.getAbsolutePath();
    14.     driver.get(filePath);
    15.  
    16.     //定位上传按钮,添加本地文件
    17.     driver.findElement(By.name("file")).sendKeys("D:\upload_file.txt");
    18.     Thread.sleep(5000);
    19.  
    20.     driver.quit();
    21.   }
    22. }

    (十八)浏览器cookie操作

    有时候我们需要验证浏览器中Cookie是否正确, 因为基于真实Cookie的测试是无法通过白盒测试和集成测试进行的。WebDriver提供了操作Cookie的相关方法可以读取、 添加和删除Cookie信息。
    WebDriver 操作Cookie的方法:

    • getCookies() 获得所有 cookie 信息。
    • getCookieNamed(String name) 返回字典的key为“name”的Cookie信息。
    • addCookie(cookie dict) 添加Cookie。“cookie_dict”指字典对象,必须有 name和value值。
    • deleteCookieNamed(String name) 删除Cookie 信息。 “name”是要删除的 cookie的名称; “optionsString” 是该Cookie的选项,目前支持的选项包括“路径” , “域” 。
    • deleteAllCookies() 删除所有 cookie 信息。

    下面通过 geCookies()来获取当前浏览器的 cookie 信息。

    1.  import java.util.Set;
    2.  import org.openqa.selenium.chrome.ChromeDriver;
    3.  import org.openqa.selenium.WebDriver;
    4.  import org.openqa.selenium.Cookie;
    5.   
    6.   
    7.  public class CookieDemo {
    8.   
    9.    public static void main(String[] args){
    10.  
    11.     WebDriver driver = new ChromeDriver();
    12.     driver.get("https://www.baidu.com");
    13.  
    14.     Cookie c1 = new Cookie("name", "key-aaaaaaa");
    15.     Cookie c2 = new Cookie("value", "value-bbbbbb");
    16.     driver.manage().addCookie(c1);
    17.     driver.manage().addCookie(c2);
    18.  
    19.     //获得 cookie
    20.     Set<Cookie> coo = driver.manage().getCookies();
    21.     System.out.println(coo);
    22.  
    23.     //删除所有 cookie
    24.     //driver.manage().deleteAllCookies();
    25.  
    26.     driver.quit();
    27.   }
    28. }

    打印结果:

    [BIDUPSID=82803D3E2DAD0F5342D22C8F96B9E088; expires=星期六, 24 二月 208512:40:10 CST; path=/; domain=.baidu.com, name=key-aaaaaaa; path=/;domain=www.baidu.com, PSTM=1486301167; expires=星期六, 24 二月 2085 12:40:10 CST;path=/; domain=.baidu.com,H_PS_PSSID=1437_21094_21943_22023; path=/;domain=.baidu.com, BD_UPN=12314753; expires=星期三, 15 二月 2017 09:26:04 CST;path=/; domain=www.baidu.com, value=value-bbbbbb; path=/;domain=www.baidu.com,BAIDUID=82803D3E2DAD0F5342D22C8F96B9E088:FG=1; expires=星期六, 24 二月 208512:40:10 CST; path=/; domain=.baidu.com, BD_HOME=0; path=/;domain=www.baidu.com, __bsi=16852840641557463410_00_0_I_R_1_0303_C02F_N_I_I_0;expires=星期日, 05 二月 2017 09:26:10 CST; path=/; domain=.www.baidu.com]

    (十九)调用JavaScript代码

    虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了executeScript()方法来执行JavaScript代码。
    用于调整浏览器滚动条位置的JavaScript代码如下:

    1.  <!-- window.scrollTo(左边距,上边距); -->
    2.  window.scrollTo(0,450);

    window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:

    1.  import org.openqa.selenium.By;
    2.  import org.openqa.selenium.WebDriver;
    3.  import org.openqa.selenium.Dimension;
    4.  import org.openqa.selenium.chrome.ChromeDriver;
    5.  import org.openqa.selenium.JavascriptExecutor;
    6.   
    7.   
    8.  public class JSDemo {
    9.   
    10.  
    11.   public static void main(String[] args) throws InterruptedException{
    12.  
    13.  
    14.     WebDriver driver = new ChromeDriver();
    15.  
    16.  
    17.     //设置浏览器窗口大小
    18.     driver.manage().window().setSize(new Dimension(700, 600));
    19.     driver.get("https://www.baidu.com");
    20.  
    21.  
    22.     //进行百度搜索
    23.     driver.findElement(By.id("kw")).sendKeys("webdriver api");
    24.     driver.findElement(By.id("su")).click();
    25.     Thread.sleep(2000);
    26.  
    27.  
    28.     //将页面滚动条拖到底部
    29.     ((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
    30.     Thread.sleep(3000);
    31.  
    32.  
    33.     driver.quit();
    34.   }
    35. }

    通过浏览器打开百度进行搜索,并且提前通过window().setSize()方法将浏览器窗口设置为固定宽高显示,目的是让窗口出现水平和垂直滚动条。然后通过executeScript()方法执行JavaScripts代码来移动滚动条的位置。
    (二十)获取窗口截图

    自动化用例是由程序去执行,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。 WebDriver提供了截图函数getScreenshotAs()来截取当前窗口。

    1.  import java.io.File;
    2.  import java.io.IOException;
    3.  import org.apache.commons.io.FileUtils;
    4.  import org.openqa.selenium.OutputType;
    5.  import org.openqa.selenium.WebDriver;
    6.  import org.openqa.selenium.chrome.ChromeDriver;
    7.  import org.openqa.selenium.TakesScreenshot;
    8.   
    9.  public class GetImg {
    10.  
    11.   public static void main(String[] arge){
    12.  
    13.     WebDriver driver = new ChromeDriver();
    14.     driver.get("https://www.baidu.com");
    15.  
    16.     File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    17.     try {
    18.       FileUtils.copyFile(srcFile,new File("d:\screenshot.png"));
    19.     } catch (IOException e) {
    20.       e.printStackTrace();
    21.     }
    22.  
    23.     driver.quit();
    24.   }
    25. }

    脚本运行完成后打开D盘,就可以找到screenshot.png图片文件了。

    Selenium自动化测试——识别验证码

    Lionel_Qin 2018-07-09 15:35:55   4352   收藏 7

    分类专栏: Selenium自动化测试 文章标签: 自动化测试 tess4j 识别验证码

    版权

    由于在笔者在进行自动化测试的过程中,每次登录时第一步都需要人眼识别验证码,将它作为参数传给后台再写到前端页面上。为了以后扩展可以自动化的功能,并优化自动化脚本,因此开始在脚本中增加了识别验证码的功能。

    识别验证码主要分为三步:

    1、截取当前显示验证码的屏幕图片

    2、剪裁屏幕图片得到验证码图片

    3、调用tess4j库识别验证码

    接下来笔者将按照上述步骤实现识别验证码的功能。

    前置条件:

    IDE:Eclipse

    Project Manager:Maven

    一、在开始之前,首先要在Maven中引入tess4j:

    Step 1 : 打开pom.xml,进入标签页Dependencies

    Step 2 : 点击“Add”,在库名称中输入“tess4j”

    Step 3 : 在搜索到的结果中选择tess4j,点击“OK”,并点击保存。等待项目建立完成即可。

    二、截取整个屏幕,并保存到相应的文件夹

    截图方法:

    public void robotSnapshot(String type,String path) {

                     try{

                             BufferedImage img = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 

                    ImageIO.write(img, type, new File(path));

                     }catch(Exception e){

                             e.printStackTrace();

                             System.out.println("Snapshot has problem");

                     }

    type: 表示截图的文件类型,可以填写png,jpg等

    path: 表示文件保存路径,需要给路径加上后缀

    三、裁剪屏幕图片

    裁剪方法:

    public void cut(int x1, int y1, int width, int height,

                             String sourcePath, String descpath) {

                     FileInputStream is = null;

                     ImageInputStream iis = null;

                     try {

                             is = new FileInputStream(sourcePath);

                             String fileSuffix = sourcePath.substring(sourcePath

                                              .lastIndexOf(".") + 1);

                             Iterator<ImageReader> it = ImageIO

                                              .getImageReadersByFormatName(fileSuffix);

                             ImageReader reader = it.next();

                             iis = ImageIO.createImageInputStream(is);

                             reader.setInput(iis, true);

                             ImageReadParam param = reader.getDefaultReadParam();

                             Rectangle rect = new Rectangle(x1, y1, width, height);

                             param.setSourceRegion(rect);

                             BufferedImage bi = reader.read(0, param);

                             ImageIO.write(bi, fileSuffix, new File(descpath));

                     } catch (Exception ex) {

                             ex.printStackTrace();

                     } finally {

                             if (is != null) {

                                      try {

                                              is.close();

                                      } catch (IOException e) {

                                              e.printStackTrace();

                                      }

                                      is = null;

                             }

                             if (iis != null) {

                                      try {

                                              iis.close();

                                      } catch (IOException e) {

                                              e.printStackTrace();

                                      }

                                      iis = null;

                             }

                     }

            }

    x1 : 选择区域左上角的x坐标

    y1 : 选择区域左上角的y坐标

    width : 选择区域的宽度

    height : 选择区域的高度

    sourcePath : 源图片路径

    descpath : 裁切后图片的保存路径

    引用:https://blog.csdn.net/5iasp/article/details/8587554

    四、调用tess4j

    调用方式:

                     File imageFile = new File(descpath);

                     //调用Tesseract

                     ITesseract instance = new Tesseract();

                    instance.setDatapath("C:\maven-project\auto_shyd\tessdata");

                     String verifycode = null;

                     try {

                             verifycode = instance.doOCR(imageFile);

                     } catch (TesseractException e1) {

                     e1.printStackTrace();

                     }

                     verifycode = verifycode.replaceAll("[^a-z^A-Z^0-9]", "");//替换大小写及数字

                     System.out.println("Verify code is :" + verifycode);

    1.需要将C:UsersAdministrator.m2 epository etsourceforge ess4j ess4j4.0.2 路径下的jar包中的文件夹tessdata解压出来,解压后的文件位置即

    instance.setDatapath()

     设置的路径位置。

    2.descpath即为验证码图片的路径

    小结

    在本次实现识别验证码功能的过程中,本意是想通过直接获取tessdata的路径,作为语言包的路径:

                    URL url = ClassLoader.getSystemResource("tessdata");

                     String tesspath = url.getPath().substring(6);

                     //进行读取,默认是英文,如果要使用中文包,加上instance.setLanguage("chi_sim");

                     //尚未解决打不开tessdata的问题,只能将文件移出至项目文件夹,作为默认路径,如有需要请修改

                     instance.setDatapath(tesspath);

    但是由于编译过程中,一直提示无法打开该路径,只好将tessdata解压出来。

    ————————————————

    版权声明:本文为CSDN博主「Lionel_Qin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/Lionel_Qin/article/details/80969868

    selenium phantomjs浏览器 java环境搭建

    Tim老师0人评论4805人阅读2018-07-04 20:19:38

    java selenium搭建×××面浏览器

    1.http://phantomjs.org/

    下载windows版phantomjs

    2.解压后bin目录下会有exe文件

    3.测试代码:

    复制代码
    package se;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.phantomjs.PhantomJSDriver;
    public class test {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

    //    System.setProperty("webdriver.gecko.driver", "C:\Program Files (x86)\Mozilla Firefox\geckodriver.exe");

        System.setProperty("phantomjs.binary.path", "C:\phantomjs-2.1.1-windows\bin\phantomjs.exe");

    //    WebDriver driver = new FirefoxDriver();

        WebDriver driver = new PhantomJSDriver();

        driver.get("http://www.baidu.com");

        System.out.println(driver.getCurrentUrl());

    }

    }

    4.url成功打印
    5.

    selenium 对验证码处理

    https://blog.51cto.com/11959730/2309556

    Tim老师0人评论2925人阅读2018-10-26 19:24:19

    selenium -验证码处理
    1.WEB网站为了防止客户机恶意***,加入验证码功能

    2.selenium处理验证码时常用的方法是通过cooike,对于一般网站验证码识别难度不大,可以使用第三方平台验证码接口,以去哪儿网为例,验证码为图片,我们只要把图片保存下来

    调用第三方平台。

    http://wiki.ruokuai.com/ 下载java接口文档,直接调用以下接口

    public static String createByPost(String username, String password,

                String typeid, String timeout, String softid, String softkey,

                String filePath) {

            String result = "";

            String param = String.format(

                    "username=%s&password=%s&typeid=%s&timeout=%s&softid=%s&softkey=%s",

                    username, password, typeid, timeout, softid, softkey);

            try {

                File f = new File(filePath);

                if (null != f) {

                    int size = (int) f.length();

                    byte[] data = new byte[size];

                    FileInputStream fis = new FileInputStream(f);

                    fis.read(data, 0, size);

                    if(null != fis) fis.close();

                    if (data.length > 0)   

                        result = RuoKuai.httpPostImage("http://api.ruokuai.com/create.txt", param, data);

                }

            } catch(Exception e) {

                result = "未知问题";

            }

            return result;

        }

    例:

    先对验证码进行截图,保存到项目路径下

    获取ER7C便是验证码

    ©著作权归作者所有:来自51CTO博客作者Tim老师的原创作品,如需转载,请注明出处,否则将追究法律责任

    selenium自动化测试

    https://blog.51cto.com/11959730/2309556

    本文介绍了python selenium UI自动化解决验证码的4种方法,分享给大家,具体如下:

    测试环境

    • windows7+
    • firefox50+
    • geckodriver # firefox浏览器驱动
    • python3
    • selenium3

    selenium UI自动化解决验证码的4种方法:去掉验证码、设置万能码、验证码识别技术-tesseract、添加cookie登录,本次主要讲解验证码识别技术-tesseract和添加cookie登录。

    1. 去掉验证码

    去掉验证码,直接通过用户名和密码登陆网站。

    2. 设置万能码

    设置万能码,就是不管什么情况,输入万能码,都可以成功登录网站。

    3. 验证码识别技术-tesseract

    准备条件

    安装好Python,通过pip install pillow安装pillow库。然后将tesseract中的tesseract.exe和testdata文件夹放到测试脚本所在目录下,testdata中默认有eng.traineddata和osd.traineddata,如果要识别汉语,请自行下载对应包。

    以下是两个主要文件,TesseractPy3.py是通过python代码去调用tesseract以达到识别验证码的效果。code.py是通过selenium获取验证码图片,进而使用TesseractPy3中的函数得到验证码,实现网站的自动化登陆。

    TesseractPy3.py

    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

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    #coding=utf-8

    import os

    import subprocess

    import traceback

    import logging

    from PIL import Image # 来源于Pillow库

    TESSERACT = 'tesseract' # 调用的本地命令名称

    TEMP_IMAGE_NAME = "temp.bmp" # 转换后的临时文件

    TEMP_RESULT_NAME = "temp" # 保存识别文字临时文件

    CLEANUP_TEMP_FLAG = True # 清理临时文件的标识

    INCOMPATIBLE = True # 兼容性标识

    def image_to_scratch(image, TEMP_IMAGE_NAME):

      # 将图片处理为兼容格式

      image.save(TEMP_IMAGE_NAME, dpi=(200,200))

    def retrieve_text(TEMP_RESULT_NAME):

      # 读取识别内容

      inf = open(TEMP_RESULT_NAME + '.txt','r')

      text = inf.read()

      inf.close()

      return text

    def perform_cleanup(TEMP_IMAGE_NAME, TEMP_RESULT_NAME):

      # 清理临时文件

      for name in (TEMP_IMAGE_NAME, TEMP_RESULT_NAME + '.txt', "tesseract.log"):

        try:

          os.remove(name)

        except OSError:

          pass

    def call_tesseract(image, result, lang):

      # 调用tesseract.exe,将识读结果写入output_filename中

      args = [TESSERACT, image, result, '-l', lang]

      proc = subprocess.Popen(args)

      retcode = proc.communicate()

    def image_to_string(image, lang, cleanup = CLEANUP_TEMP_FLAG, incompatible = INCOMPATIBLE):

      # 假如图片是不兼容的格式并且incompatible = True,先转换图片为兼容格式(本程序将图片转换为.bmp格式),然后获取识读结果;如果cleanup=True,操作之后删除临时文件。

      logging.basicConfig(filename='tesseract.log')

      try:

        try:

          call_tesseract(image, TEMP_RESULT_NAME, lang)

          text = retrieve_text(TEMP_RESULT_NAME)

        except Exception:

          if incompatible:

            image = Image.open(image)

            image_to_scratch(image, TEMP_IMAGE_NAME)

            call_tesseract(TEMP_IMAGE_NAME, TEMP_RESULT_NAME, lang)

            text = retrieve_text(TEMP_RESULT_NAME)

          else:

            raise

        return text

      except:

        s=traceback.format_exc()

        logging.error(s)

      finally:

        if cleanup:

          perform_cleanup(TEMP_IMAGE_NAME, TEMP_RESULT_NAME)

    code.py

    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

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    #coding=utf-8

    from selenium import webdriver

    from selenium.webdriver.common.by import By

    from selenium.webdriver.common.keys import Keys

    from selenium.webdriver.support.ui import Select

    from selenium.common.exceptions import NoSuchElementException

    from selenium.common.exceptions import NoAlertPresentException

    from PIL import Image

    import unittest, time, re

    from TesseractPy3 import *

    class lgoin(unittest.TestCase):

      def setUp(self):

        self.driver = webdriver.Ie()

        self.driver.implicitly_wait(30)

        self.base_url = 'http://127.0.0.1:8080/test' # 要测试的链接

        self.title = '某管理平台' # 测试网站的Title

        self.verificationErrors = []

        self.accept_next_alert = True

      def test_lgoin(self):

        driver = self.driver

        driver.get(self.base_url)

        driver.maximize_window()

        driver.save_screenshot('All.png') # 截取当前网页,该网页有我们需要的验证码

        imgelement = driver.find_element_by_class_name('kaptchaImage')

        location = imgelement.location # 获取验证码x,y轴坐标

        size = imgelement.size # 获取验证码的长宽

        rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height'])) # 写成我们需要截取的位置坐标

        i = Image.open("All.png") # 打开截图

        result = i.crop(rangle) # 使用Image的crop函数,从截图中再次截取我们需要的区域

        result.save('result.jpg')

        text = image_to_string('result.jpg', 'eng').strip()

        assert self.title in driver.title

        driver.find_element_by_id(u'userCode').clear()

        driver.find_element_by_id(u'userCode').send_keys('XXXXXX') # 用户名

        driver.find_element_by_id(u'password').clear()

        driver.find_element_by_id(u'password').send_keys('XXXXXX') # 密码

        #driver.find_element_by_name('verifyCode').clear()

        driver.find_element_by_name('verifyCode').send_keys(text)

        driver.find_element_by_name('submit').submit()

      def is_element_present(self, how, what):

        try: self.driver.find_element(by=how, value=what)

        except NoSuchElementException as e: return False

        return True

      def is_alert_present(self):

        try: self.driver.switch_to_alert()

        except NoAlertPresentException as e: return False

        return True

      def close_alert_and_get_its_text(self):

        try:

          alert = self.driver.switch_to_alert()

          alert_text = alert.text

          if self.accept_next_alert:

             alert.accept()

          else:

            alert.dismiss()

          return alert_text

        finally: self.accept_next_alert = True

      def tearDown(self):

        #self.driver.quit()

        self.assertEqual([], self.verificationErrors)

    if __name__ == "__main__":

      unittest.main()

    最后,执行命令python code.py,就可以成功自动登录网站。

    注意:

    由于受验证码图片质量以及清晰度的影响,并不是每一次都能成功登陆。

    4. 添加cookie登录

    首先获取网站登陆后的cookie,然后通过添加cookie的方式,实现网站登陆的目的。我们用cook来表示xxxxxx的登录后的cookie。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    # coding=utf-8

    from selenium import webdriver

    import time

    driver = webdriver.Firefox()

    driver.get("http://www.xxxxxx.com/") # 要登陆的网站

    driver.add_cookie(cook) # 这里添加cookie,有时cookie可能会有多条,需要添加多次

    time.sleep(3)

    # 刷新下页面就可以看到登陆成功了

    driver.refresh()

    注意:

    登录时有勾选下次自动登录的请勾


    public static WebDriver driver;

    public static void InitDriver() {
        String pathfirefoxexe="D:\tools\firefox30\firefox.exe";
        String pathwebdriver="D:\tools\firefox30\geckodriver.exe";
        System.setProperty("webdriver.firefox.bin",pathfirefoxexe);
        //System.setProperty("webdriver.chrome.bin","C:\Program Files (x86)\Google\Chrome\Application\chrome.exe");
        // System.setProperty("webdriver.chrome.driver", "D:\jar\seleniumjar\chromedriver_win32\chromedriver.exe");
        
    System.setProperty("webdriver.firefox.marionette",pathwebdriver);
        //driver = new ChromeDriver();  https://www.imooc.com/user/newlogin/from_url
        
    driver=new FirefoxDriver();
        driver.get("https://www.baidu");
        //driver.manage().window().maximize();
        
    driver.manage().window().maximize();
    }
    public void inputBox(){
        driver.findElement(By.name("email")).sendKeys("609037724@qq.com");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        driver.findElement(By.name("email")).clear();
        String s=driver.findElement(By.name("email")).getAttribute("placeholder");
        System.out.print(s);
    }

    public static void main(String[] args) {
        ActionSelenium as=new ActionSelenium();
        as.InitDriver();
        as.inputBox();
    }

    public static void main(String[] args) {
        System.out.println(11);
        InitDriver();
        //获取火狐的安装路径  http://www.w3school.com.cn/
        
    System.out.println(22);
        System.out.println(33);
    }

    在使用selenium搭建自己的自检测试平台时,遇到一个问题,使用这一句定位某个id组件的时候,总是报错。报错现象如下所示:
    org.openqa.selenium.InvalidElementStateException: invalid element state: Failed to execute 'querySelectorAll' on 'Document': '#paramValueTable div#60002_60002001_0 > select.textInput' is not a valid selector.
    (Session info: chrome=38.0.2125.122)
    (Driver info: chromedriver=2.9.248315,platform=Windows NT 6.1 x86) (WARNING: The server did not provide any stacktrace information)
    Command duration or timeout: 27 milliseconds
    Build info: version: '2.25.0', revision: '17482', time: '2012-07-18 21:09:54'
    System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_79'
    Driver info: driver.version: RemoteWebDriver
    Session ID: 5a0458394ba8566a9fdd8a33e0b412f2
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:188)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:498)
    at org.openqa.selenium.remote.RemoteWebDriver.findElements(RemoteWebDriver.java:287)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementsByCssSelector(RemoteWebDriver.java:349)
    at org.openqa.selenium.By$ByCssSelector.findElements(By.java:417)
    at org.openqa.selenium.remote.RemoteWebDriver.findElements(RemoteWebDriver.java:256)
    at comba.BaseTest.checkAllDiv(BaseTest.java:1189)
    at comba.BaseTest.test(BaseTest.java:343)
    at comba.BaseTest.(BaseTest.java:173)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at Runner.test(Runner.java:344)
    at Runner.run(Runner.java:252)
    at Runner.runMain(Runner.java:203)
    at Runner.main(Runner.java:176)

     而   为了以防我的定位没有问题,我用xPath方法来定位确没有问题,如下代码所示(第三行注释的代码为我用xpath原路径定位的代码,第二行代码为报错的代码):

     在百思不得其解中,在百度知道中问答,有答友提供线索,貌似用By.cssSelector来定位组件时,#后面的id不能是数字开头的,数字开头会报错,而我要定位查询的id就是以数字开头的,组成的路径是这样“#paramValueTable div#60002_60002001_0 > input.textInput[type = "text"]”,所以会报错。
     具体可以详阅如下网址:
      http://stackoverflow.com/questions/20306204/using-queryselector-with-ids-that-are-numbers
      那这样子我就知道根源所在了,我用了另外路径组成方法来来成功定位。
       
      解决方案:
      driver.findElements(By.cssSelector("#paramValueTable div#60002_60002001_0 > input.textInput[type = ‘text’ "))
      改成
      driver.findElements(By.cssSelector("#paramValueTable div[id = '60002_60002001_0']> input.textInput[type = ‘text’ ")).这样子就没有问题了。
    ————————————————
    版权声明:本文为CSDN博主「xixiruyiruyi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xixiruyiruyi/article/details/62044491

  • 相关阅读:
    C# delegate委托的用法
    C# new关键字的使用
    C# abstract抽象类的使用
    C# override关键字的使用
    C# sealed关键字的使用
    C# 虚函数virtual的使用
    Java IO流简介
    SpringBoot中异步请求的使用
    SpringBoot中异步调用的使用
    github
  • 原文地址:https://www.cnblogs.com/xinxihua/p/14587103.html
Copyright © 2020-2023  润新知