0


selenium-java常用api

本篇文章主要介绍使用java语言采用selenium测试框架进行自动化测试,主要内容包含selenium的安装以及api的使用方法。

1、selenium的安装

1.1 下载本地jar包导入项目中

首先访问selenium官网,点击水平导航栏的Downloads选项。
在这里插入图片描述

页面右下方的Latest stable version 4.3.0显示的java版本的最新的selenium驱动包,我们先不忙下载,把页面往下翻。
在这里插入图片描述

如上图,selenium目前支持五种语言,分别是c#、ruby、java、pathon和js。语言下方的选项含义分别为:

  • Stable:代表该语言selenium驱动的最新稳定版本。
  • Changelog:代表变动日志。
  • API Docs:代表该语言selenium启动的api详细文档,这个很重要,里面涵盖了该语言下selenium驱动的所有api接口。

再往下翻:
在这里插入图片描述

Previous Releases:代表这里可以查看所有的历史版本信息。

点击releases链接。
在这里插入图片描述

在弹出的页面中你可以看到所有的selenium的java驱动版本信息。点击最新的Selenium 4.3.0展开。
在这里插入图片描述
在这里插入图片描述

这里我们分别解释一下:

  • IEDriverServer:IE浏览器的驱动包。
  • donet:是C#语言的驱动包。
  • selenium-java:selenium本地客户端的驱动包。
  • selenium-server:selenium的远程调用驱动包。

先介绍一下selenium-server-standalone 和selenium-server, selenium-java的区别:

  • selenium1.0还是 seleniumRC的时候,需要启动selenium-server-standalone包,用来做server。selenium RC通过server来给code和broswer建立通道,同时,该jar包包括我们用得所有的方法。
  • 在新版的selenium中,即selenium2.0-webdriver,不需要这个selenium-server-standalone这个包了。WebDriver api 会直接和浏览器的native交互,现在我们用selenium-java.jar包来替代。
  • 如果使用selenium-grid,或者要在远程机器上的浏览器上运行用例,那么就需要使用selenium-server来和selenium-java配合。就是selenium-java就是的client, 它可以和本地浏览器直接交互(通过各个浏览器自身提供的driver)。同时,通过selenium-server, 这个client也可以和远程机器上浏览器进行交互。

可以看到,最新的4.3.0版本已经没有selenium-server-standalone了,只有selenium-java驱动包。

也许你还有一个疑问,为什么selenium-jar页面上提供的不是一个jar包,而是一个压缩的zip呢?那好,我们把selenium-java.zip下载下来看一下:
在这里插入图片描述
在这里插入图片描述

可以看到selenium-java.zip下面有很多jar包,也就是说我们如果不使用maven的方式去导入selenium-java的驱动包的话,我们就要该zip包下的所有jar包都手动导入到我们的项目当中,当然lib文件夹下面的jia包也要导入。

这里再额外介绍一类特殊的jar包,格式是:selenium-xxxxx-driver-4.3.0.jar,这类jar包的作用是:

当您编写selenium测试时,您可以使用客户端代码绑定以您选择的语言编写代码。然后,此代码与相关的驱动程序二进制文件进行对话,该驱动程序二进制文件使用JSON有线协议作为插件在浏览器中运行。

因此,交互作用是:
在这里插入图片描述

Selenium有一个客户端API,它详细说明了您可以通过JSON有线协议发送的所有命令,然后它有一系列代码片段,允许它与特定的驱动程序二进制文件进行交互。因此,

selenium-chrome-driver.jar

包含专门用于与chrome驱动程序二进制文件交互的代码。如果您使用的是gecko驱动程序二进制文件,则需要使用

selenium-firefox-driver.jar

。以特定浏览器为目标的每个驱动程序二进制文件都有一个关联的jar,其中包含与相关驱动程序二进制文件通信所需的代码。

为了让它工作,你需要所有的元素,所以为了能够用Webdriver驱动Google Chrome,你需要有

selenium-chrome-driver.jar

chromedriver.exe

二进制文件。

可以看到,zip包中包含了chrome、chromium、edge、firefox、opera、safari等类型的jar包用来和不同的浏览器驱动程序进行交互。

所以,如果不是maven项目,就需要下载zip包,并把里面所有的jar包都导入到项目当中。

1.2 通过maven方式导入驱动包

只需要在项目的pom.xml文件中添加以下依赖即可。

<!-- selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.3.0</version></dependency>

导入后可以在maven查看导入的依赖:
在这里插入图片描述

可以看到,selenium-java-4.3.0.jar通过jar包里面自带pom文件的方式,已经包需要的jar包通通都导入进来了。推荐使用maven的方式导入selenium驱动包。

1.3 浏览器驱动

1.3.1 下载浏览器驱动

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

1.3.2 设置浏览器驱动

windows

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

linux

同样的,我们可以在linux系统上新建一个路径/driver,将下载的驱动包放到下面,同时给予驱动包足够的用户权限。然后将路径到path中:

#修改/etc/profile文件exportPATH=${PATH}:/driver

1.3.3 验证浏览器驱动

添加环境变量的验证方式:

importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.firefox.FirefoxDriver;importorg.openqa.selenium.edge.EdgeDriver;importorg.openqa.selenium.ie.InternetExplorerDriver;importorg.openqa.selenium.opera.OperaDriver;importorg.openqa.selenium.phantomjs.PhantomJSDriver;WebDriver driver =newChromeDriver();//Chrome浏览器WebDriver driver =newFirefoxDriver();//Firefox浏览器WebDriver driver =newEdgeDriver();//Edge浏览器WebDriver driver =newInternetExplorerDriver();// Internet Explorer浏览器WebDriver driver =newOperaDriver();//Opera浏览器WebDriver driver =newPhantomJSDriver();//PhantomJS

当然也可以不设置环境变量,通过调用浏览器的绝对路径的验证方式:

System.setProperty("webdriver.chrome.driver","F:\\dirver\\chromedriver.exe");ChromeOptions option =newChromeOptions();
option.addArguments("disable-infobars");//禁止策略化//            option.addArguments("--headless");  //浏览器不提供可视化页面(无头模式). linux下如果系统不支持可视化不加这条会启动失败
option.addArguments("--no-sandbox");//解决DevToolsActivePort文件不存在的报错
driver =newChromeDriver(option);

2、selenium-java的api讲解

可以通过上面的讲解,点击selenium官网的selenium-java的API Docs进入api文档页面。
在这里插入图片描述

页面上列举了很多的包,我们主要使用的包是第一个org.openqa.selenium。下面我们来详细的讲解每个api。

2.1 页面元素定位

2.1.1 selenium元素定位方法

Selenium提供了8种定位方式。

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

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

  • findElement(By.id()) 通过id属性定位
  • findElement(By.name()) 通过name属性定位
  • findElement(By.className()) 通过类属性定位
  • findElement(By.tagName()) 通过标签定位
  • findElement(By.linkText()) 通过链接文本定位
  • findElement(By.partialLinkText()) 通过部分链接文本定位
  • findElement(By.xpath()) 通过xpath定位
  • findElement(By.cssSelector()) 通过cssSelector定位

2.1.2 定位方法的用法

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

<html><head><bodylink="#0000cc"><aid="result_logo"href="/"onmousedown="returnc({'fm':'tab','tab':'logo'})"><formid="form"class="fm"name="f"action="/s"><spanclass="soutu-btn"></span><inputid="kw"class="s_ipt"name="wd"value=""maxlength="255"autocomplete="off">

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

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

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

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

xpath和cssSelector我这里只做了简单的介绍,后面我会写专门的博客来进行讲解。

2.2 控制浏览器操作

2.2.1 控制浏览器窗口大小

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

  • maximize() 设置浏览器最大化
  • setSize() 设置浏览器宽高
importorg.openqa.selenium.Dimension;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;publicclassBrowser{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver=newChromeDriver();    
    driver.get("https://www.baidu.cn");     
    driver.manage().window().maximize();Thread.sleep(2000);     
    driver.get("https://m.baidu.cn");    
    driver.manage().window().setSize(newDimension(480,800));Thread.sleep(2000);     
    driver.quit();}}

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

2.2.2 控制浏览器前进、后退

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

  • back() 模拟浏览器后退按钮
  • forward() 模拟浏览器前进按钮
importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.By;publicclassBrowserGo{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver =newChromeDriver();//get 到百度首页    
    driver.get("https://www.baidu.com/");System.out.printf("now accesss %s \n", driver.getCurrentUrl());Thread.sleep(2000);//点击“新闻” 链接    
    driver.findElement(By.linkText("新闻")).click();System.out.printf("now accesss %s \n", driver.getCurrentUrl());Thread.sleep(2000);//执行浏览器后退    
    driver.navigate().back();System.out.printf("back to %s \n", driver.getCurrentUrl());Thread.sleep(2000);//执行浏览器前面    
    driver.navigate().forward();System.out.printf("forward to %s \n", driver.getCurrentUrl());Thread.sleep(2000);     
    driver.quit();}}

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

2.2.3 刷新页面

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

  • refresh() 刷新页面(F5)
//刷新页面
driver.navigate().refresh();

2.3 WebDriver常用方法

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

2.3.1 常用方法

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

  • clear() 清除文本。
  • sendKeys(*value) 模拟按键输入。
  • click() 单击元素。
importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;publicclassBaiduDemo{publicstaticvoidmain(String[] args){WebDriver driver =newChromeDriver();    
    driver.get("https://www.baidu.com/");WebElement search_text = driver.findElement(By.id("kw"));WebElement search_button = driver.findElement(By.id("su"));     
    search_text.sendKeys("Java");    
    search_text.clear();    
    search_text.sendKeys("Selenium");    
    search_button.click();     
    driver.quit();}}

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

2.3.2 其他常用方法

  • submit()

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

WebElement search_text = driver.findElement(By.id("kw"));
search_text.sendKeys("Selenium");
search_text.submit();
  • getSize() 返回元素的尺寸。
  • getText() 获取元素的文本。
  • getAttribute(name) 获得属性值。
  • isDisplayed() 设置该元素是否用户可见。
importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;publicclassBaiduDemo{publicstaticvoidmain(String[] args){WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com/");//获得百度输入框的尺寸WebElement size = driver.findElement(By.id("kw"));System.out.println(size.getSize());//返回百度页面底部备案信息WebElement text = driver.findElement(By.id("cp"));System.out.println(text.getText());//返回元素的属性值, 可以是 id、 name、 type 或元素拥有的其它任意属性WebElement ty = driver.findElement(By.id("kw"));System.out.println(ty.getAttribute("type"));//返回元素的结果是否可见, 返回结果为 True 或 FalseWebElement display = driver.findElement(By.id("kw"));System.out.println(display.isDisplayed());
 
    driver.quit();}}

打印结果:

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

2.4 模拟鼠标操作

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

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

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

importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.interactions.Actions;publicclassMouseDemo{publicstaticvoidmain(String[] args){WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com/");WebElement search_setting = driver.findElement(By.linkText("设置"));Actions action =newActions(driver);
    action.clickAndHold(search_setting).perform();
 
    driver.quit();}}
  • Actions(driver) 调用Actions()类,将浏览器驱动driver作为参数传入。
  • clickAndHold() 方法用于模拟鼠标悬停操作, 在调用时需要指定元素定位。
  • perform() 执行所有Actions中存储的行为, 可以理解成是对整个操作的提交动作。

其他方法:

Actions action =newActions(driver);// 鼠标右键点击指定的元素
action.contextClick(driver.findElement(By.id("element"))).perform();// 鼠标双击指定的元素
action.doubleClick(driver.findElement(By.id("element"))).perform();// 鼠标拖拽动作,将source元素拖放到target元素的位置。WebElement source = driver.findElement(By.name("element"));WebElement target = driver.findElement(By.name("element"));
action.dragAndDrop(source,target).perform();// 释放鼠标
action.release().perform();

2.5 模拟键盘操作

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

importorg.openqa.selenium.WebElement;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.By;importorg.openqa.selenium.Keys;publicclassKeyboard{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com");WebElement input = driver.findElement(By.id("kw"));//输入框输入内容
    input.sendKeys("seleniumm");Thread.sleep(2000);//删除多输入的一个 m
    input.sendKeys(Keys.BACK_SPACE);Thread.sleep(2000);//输入空格键+“教程”
    input.sendKeys(Keys.SPACE);
    input.sendKeys("教程");Thread.sleep(2000);//ctrl+a 全选输入框内容
    input.sendKeys(Keys.CONTROL,"a");Thread.sleep(2000);//ctrl+x 剪切输入框内容
    input.sendKeys(Keys.CONTROL,"x");Thread.sleep(2000);//ctrl+v 粘贴内容到输入框
    input.sendKeys(Keys.CONTROL,"v");Thread.sleep(2000);//通过回车键盘来代替点击操作
    input.sendKeys(Keys.ENTER);Thread.sleep(2000);
 
    driver.quit();}}

在使用键盘按键方法前需要先导入 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

2.6 获取断言信息

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

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

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

importorg.openqa.selenium.By;importorg.openqa.selenium.Keys;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;publicclassAssertDemo{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver =newChromeDriver();
      driver.get("https://www.baidu.com");System.out.println("Search before================");//获取当前的 title 和 urlSystem.out.printf("title of current page is %s\n", driver.getTitle());System.out.printf("url of current page is %s\n", driver.getCurrentUrl());//百度搜索WebElement search = driver.findElement(By.id("kw"));
      search.sendKeys("Selenium");
      search.sendKeys(Keys.ENTER);Thread.sleep(2000);System.out.println("Search after================");//获取当前的 title 和 urlSystem.out.printf("title of current page is %s\n", driver.getTitle());System.out.printf("url of current page is %s\n", driver.getCurrentUrl());//获取第一条搜索结果的标题WebElement result = driver.findElement(By.xpath("//div[@id='content_left']/div/h3/a"));System.out.println(result.getText());
 
      driver.quit();}}

打印结果:

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

2.7 设置元素等待

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

2.7.1 显示等待

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

importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.support.ui.WebDriverWait;importorg.openqa.selenium.support.ui.ExpectedCondition;publicclassTimeOut01{publicstaticvoidmain(String[]args)throwsInterruptedException{WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com");//显式等待, 针对某个元素等待WebDriverWait wait =newWebDriverWait(driver,10,1);
 
    wait.until(newExpectedCondition<WebElement>(){@OverridepublicWebElementapply(WebDriver driver){return driver.findElement(By.id("kw"));}}).sendKeys("selenium");
 
    driver.findElement(By.id("su")).click();Thread.sleep(2000);
 
    driver.quit();}}

WebDriverWait类是由WebDirver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:

  • WebDriverWait(driver, 10, 1) 。
  • driver: 浏览器驱动。 10: 最长超时时间, 默认以秒为单位。 1: 检测的的间隔(步长) 时间, 默认为 0.5s。

2.7.2 隐式等待

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

  • implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
  • setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
  • pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常。
importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.By;importjava.util.concurrent.TimeUnit;publicclassTimeOut02{publicstaticvoidmain(String[] args){WebDriver driver =newChromeDriver();//页面加载超时时间设置为 5s
    driver.manage().timeouts().pageLoadTimeout(5,TimeUnit.SECONDS);
    driver.get("https://www.baidu.com/");//定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常
    driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
    driver.findElement(By.id("kw")).sendKeys("selenium");//异步脚本的超时时间设置成 3s
    driver.manage().timeouts().setScriptTimeout(3,TimeUnit.SECONDS);
 
    driver.quit();}}

2.8 定位一组元素

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

importorg.openqa.selenium.By;......findElements(By.id())findElements(By.name())findElements(By.className())findElements(By.tagName())findElements(By.linkText())findElements(By.partialLinkText())findElements(By.xpath())findElements(By.cssSelector())

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

importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;importjava.util.List;publicclassElementsDemo{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com/");WebElement search_text = driver.findElement(By.id("kw"));
    search_text.sendKeys("selenium");
    search_text.submit();Thread.sleep(2000);//匹配第一页搜索结果的标题, 循环打印List<WebElement> search_result = driver.findElements(By.xpath("//div/div/h3"));//打印元素的个数System.out.println(search_result.size());// 循环打印搜索结果的标题for(WebElement result : search_result){System.out.println(result.getText());}System.out.println("-------我是分割线---------");//打印第n结果的标题WebElement text = search_result.get(search_result.size()-10);System.out.println(text.getText());
 
    driver.quit();}}

打印结果:

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

2.9 多表单切换

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

<html><body>
    ...
    <iframeid="x-URS-iframe"...><html><body>
           ...
           <inputname="email">

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

importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;publicclassMailLogin{publicstaticvoidmain(String[] args){WebDriver driver =newChromeDriver();
    driver.get("http://www.126.com");WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));
    driver.switchTo().frame(xf);
    driver.findElement(By.name("email")).clear();
    driver.findElement(By.name("email")).sendKeys("username");
    driver.findElement(By.name("password")).clear();
    driver.findElement(By.name("password")).sendKeys("password");
    driver.findElement(By.id("dologin")).click();
    driver.switchTo().defaultContent();//……}}

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

2.10 多窗口切换

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

importjava.util.Set;importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;publicclassMoreWindows{publicstaticvoidmain(String[] arge)throwsInterruptedException{WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com");//获得当前窗口句柄String search_handle = driver.getWindowHandle();//打开百度注册窗口
    driver.findElement(By.linkText("登录")).click();Thread.sleep(3000);
    driver.findElement(By.linkText("立即注册")).click();//获得所有窗口句柄Set<String> handles = driver.getWindowHandles();//判断是否为注册窗口, 并操作注册窗口上的元素for(String handle : handles){if(handle.equals(search_handle)==false){//切换到注册页面
        driver.switchTo().window(handle);System.out.println("now register window!");Thread.sleep(2000);
        driver.findElement(By.name("userName")).clear();
        driver.findElement(By.name("userName")).sendKeys("user name");
        driver.findElement(By.name("phone")).clear();
        driver.findElement(By.name("phone")).sendKeys("phone number");//......Thread.sleep(2000);//关闭当前窗口
        driver.close();}}Thread.sleep(2000);
 
    driver.quit();}}

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

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

2.11 下拉框选择

有时我们会碰到下拉框,WebDriver提供了Select类来处理下接框。
搜索下拉框实现代码如下:

<selectid="nr"name="NR"><optionvalue="10"selected>每页显示 10 条</option><optionvalue="20">每页显示 20 条</option><optionvalue="50">每页显示 50 条</option><select>

操作下接框代码如下:

importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.support.ui.Select;publicclassSelectDemo{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com");
 
    driver.findElement(By.linkText("设置")).click();
    driver.findElement(By.linkText("搜索设置")).click();Thread.sleep(2000);//<select>标签的下拉框选择WebElement el = driver.findElement(By.xpath("//select"));Select sel =newSelect(el);
    sel.selectByValue("20");Thread.sleep(2000);
 
    driver.quit();}}

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

还有两种方法:

  • selectByIndex,获取下标的方式选择。
  • selectByVisibleText,获取文本的方式选择。

2.12 警告框处理

在 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()方法接受这个弹窗。
在这里插入图片描述
接受一个警告框的代码如下:

importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;publicclassAlertDemo{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com");
 
    driver.findElement(By.linkText("设置")).click();
    driver.findElement(By.linkText("搜索设置")).click();Thread.sleep(2000);//保存设置
    driver.findElement(By.className("prefpanelgo")).click();//接收弹窗
    driver.switchTo().alert().accept();Thread.sleep(2000);
 
    driver.quit();}}

2.13 文件上传

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

<html><head><metahttp-equiv="content-type"content="text/html;charset=utf-8"/><title>upload_file</title><linkhref="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css"rel="stylesheet"/></head><body><divclass="row-fluid"><divclass="span6 well"><h3>upload_file</h3><inputtype="file"name="file"/></div></div></body><scriptsrc="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></scrip></html>

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

importjava.io.File;importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;publicclassUpFileDemo{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver =newChromeDriver();File file =newFile("./HTMLFile/upfile.html");String filePath = file.getAbsolutePath();
    driver.get(filePath);//定位上传按钮, 添加本地文件
    driver.findElement(By.name("file")).sendKeys("D:\\upload_file.txt");Thread.sleep(5000);
 
    driver.quit();}}

2.14 浏览器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的名称 。
  • deleteAllCookies() 删除所有 cookie 信息。

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

importjava.util.Set;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.Cookie;publicclassCookieDemo{publicstaticvoidmain(String[] args){WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com");Cookie c1 =newCookie("name","key-aaaaaaa");Cookie c2 =newCookie("value","value-bbbbbb");
    driver.manage().addCookie(c1);
    driver.manage().addCookie(c2);//获得 cookieSet<Cookie> coo = driver.manage().getCookies();System.out.println(coo);//删除所有 cookie//driver.manage().deleteAllCookies();
 
    driver.quit();}}

打印结果:

[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]

2.15 调用JavaScript代码

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

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

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

importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.Dimension;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.JavascriptExecutor;publicclassJSDemo{publicstaticvoidmain(String[] args)throwsInterruptedException{WebDriver driver =newChromeDriver();//设置浏览器窗口大小
    driver.manage().window().setSize(newDimension(700,600));
    driver.get("https://www.baidu.com");//进行百度搜索
    driver.findElement(By.id("kw")).sendKeys("webdriver api");
    driver.findElement(By.id("su")).click();Thread.sleep(2000);//将页面滚动条拖到底部((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");Thread.sleep(3000);
 
 
    driver.quit();}}

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

2.16 获取窗口截图

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

importjava.io.File;importjava.io.IOException;importorg.apache.commons.io.FileUtils;importorg.openqa.selenium.OutputType;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.TakesScreenshot;publicclassGetImg{publicstaticvoidmain(String[] arge){WebDriver driver =newChromeDriver();
    driver.get("https://www.baidu.com");File srcFile =((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);try{FileUtils.copyFile(srcFile,newFile("d:\\screenshot.png"));}catch(IOException e){
      e.printStackTrace();}
 
    driver.quit();}}

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


本文转载自: https://blog.csdn.net/weixin_40228534/article/details/125954152
版权归原作者 一路向前-执着 所有, 如有侵权,请联系我们删除。

“selenium-java常用api”的评论:

还没有评论