本篇主要学习selenium的基本语法和常用函数
文章目录
selenium的基本语法
在此之前,我们需要使用 Selenium WebDriver 创建 Chrome 浏览器驱动的示例。
WebDriver webDriver = new ChromeDriver();
元素的定位
定位元素使用: findElement
定位元素可以分为两种方式,css选择器和xpath选择器
css选择器
css选择器:
id选择器:#id
类选择器:.class
标签选择器:标签名
后代选择器:父级选择器,子级选择器
代码示例:
String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
xpath选择器
绝对路径:/html/~以html开头,效率较慢
相对路径:的几种方法
相对路径+索引://form/span[1]/input
注意:以//开头代表相对路径,[]里的数值从1开始
相对路径+属性值://input[@class=“s_ipt”]
注意:@属性名
相对路径+通配符://*[@id=“su”]
注意:利用 通配符进行搜素
相对路径+文本匹配://a[text()=“新闻”]
注意:通过a标签超链接里面的内容进行搜素
代码示例:
webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).click();
相比较而言:使用css选择器定位元素效率更高
元素的操作
前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个元素进行操作。是鼠标点击还是键盘输入,或者清除元素的内容,或者提交表单等。这个取决于定位元素需要进行的下一步操作。
下面是一些常见API:
click: 点击对象
send_keys: 在对象上模拟按键输入
clear: 清除对象输入的文本内容
submit: 提交
text: 用于获取元素的文本信息
getAttribute:获取元素的值
getCurrentUrl:获取url的值
.getText():获取文本
如果点击的元素放在form标签中,此时使用submit实现的效果和click效果相同,如果点击的元素放在非form标签中,此时用sumbit会出现错误。
selenium的常用函数
等待
sleep休眠(强制等待)
添加休眠非常简单,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了,这里的休眠指固定休眠
import time
time.sleep(3)
implicitly_wait()(隐式等待)
通过添加implicitly_wait() 方法就可以方便的实现智能等待;implicitly_wait(30)的用法比time.sleep()更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait)
implicitlyWait(显示等待)
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//最长等待时间三秒
time_to_wait (隐式等待)
time_to_wait 设置的等待时长。
隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长
隐式等待和显示等待的区别(都属于智能等待)
显示等待只有等待一定的条件(程序员自己设定),不会等待全部加载完成
隐式等待需要全部加载元素,如果加载时间过了等待时间,就会报错
隐式等待不能根据某些特定的条件进行等待
显示等待可以根据特定的条件进行等待
打印信息
打印标题
使用getTitle()
String title = webDriver.getTitle();
打印URL
使用getCurrentUrl()
代码示例:
String url = webDriver.getCurrentUrl();
窗口操作
窗口切换
窗口切换较为复杂
切换窗口
private static void test11() throws InterruptedException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
sleep(4000);
//通过getWindowHandle获取get打开的页面窗口句柄
//通过getWindowHandles获取所有打开的窗口句柄
System.out.println(webDriver.getWindowHandle());
Set<String> handles = webDriver.getWindowHandles();
String target_hanfle = "";
for (String handle:handles) {
target_hanfle = handle;//通过这一系列操作
}
webDriver.switchTo().window(target_hanfle);//在新的页面查找元素
sleep(3000);
webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
}
窗口大小的设置
浏览器最大化
使用.manage().window().maximize()
代码示例:
webDriver.manage().window().maximize();//浏览器最大化
浏览器全屏
使用manage().window().fullscreen()
代码示例:
webDriver.manage().window().fullscreen();//浏览器全屏
导航操作
浏览器刷新
使用navigate().refresh()
代码示例:
webDriver.navigate().refresh();
浏览器前进
使用navigate().forward()
代码示例:
webDriver.navigate().forward();
浏览器后退
使用navigate().back()
代码示例:
webDriver.navigate().back();
鼠标事件
移动鼠标到一个元素中,menu 上面已经定义了他所指向的哪一个元素
perform()
执行所有存储的行为
ActionChains 类
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 移动
下面进行简单的举例
鼠标左键
使用click()
代码示例:
webDriver.findElement(By.cssSelector("#su")).click();//定位到元素左击
鼠标右键
使用contextClick()
代码示例
webDriver.findElement(By.cssSelector("#su")).contextClick();//定位到元素右击
键盘操作
输入操作
使用sendKeys()
代码示例:
webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
元素定位
webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。
定位一组对象一般用于以下场景:
批量操作对象,比如将页面上所有的checkbox 都勾上
先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个
代码示例:
List<WebElement> elements = driver.findElements(By.tagName("a"));
System.out.println("找到的链接数量:" + elements.size());
多层框架/窗口定位
对于一个web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一定的困难。
定位一个frame
switch to.frame(name_or_id_or_frame_element)
定位一个窗口window
switch_to.window(name_or_id_or_frame_element)
多层框架的定位
switch_to.frame(name_or_id_or_frame_element):通过frame的id或者name或者frame自带的其它
属性来定位框架,这里switch_to.frame()把当前定位的主体切换了frame里。
switch_to.default_content:从frame中嵌入的页面里跳出,跳回到最外面的默认页面中。
多层窗口定位
有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switch_to.window
用法与switch_to.frame 相同:
driver.switch_to.window(“windowName”)
下拉框处理
选择下拉框并重新实例化
下标从零开始的
private static void page3() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("网址");
WebElement webElement = webDriver.findElement(By.cssSelector("下拉框"));
Select select = new Select(webElement);
select.selectByIndex(3);//根据下拉个数
select.selectByValue("下拉属性的值");//根据下拉属性
}
文件上传操作
代码示例:
private static void page5() {
WebDriver webDriver = new ChromeDriver();
webDriver.get("网址");
webDriver.findElement(By.cssSelector("input")).sendKeys("文件地址");
}
截图操作
截图操作需要下载依赖
前往maven中央仓库点击进入
搜索common-io进行复制
内容如下,同时放入pom.xml中粘贴
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
截图代码:
private static void test12() throws InterruptedException, IOException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
webDriver.findElement(By.cssSelector("#su")).click();
sleep(3000);
File file = ((TakesScreenshot)(webDriver).getScreenshortAs(OutputType.FILE);
FileUtils.copyFile(file,new File("复制的地址"));
}
总结
定位元素:xpath,css选择器
操作测试对象:点击(click,submit),键盘输入
信息获取:url获取,title获取,某个属性值获取
鼠标操作
浏览器操作
alert操作
选项操作
截图操作
浏览器关闭操作
切换(窗口切换,frame切换)