接着上一部分,我们继续来看Selenium
一、键盘事件
使用sendKeys()方法通过形如webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL + "A");
的样式来完成键盘操作
二、鼠标事件
示例
private static void method6(){
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开百度
webDriver.get("https://www.baidu.com/");
//定位输入框并输入内容"软件测试"
webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
//点击"百度一下"按钮进行百度
webDriver.findElement(By.cssSelector("#su")).click();
//智能等待3min
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.MINUTES);
//创建一个鼠标对象
Actions actions = new Actions(webDriver);
WebElement element = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-tieba_3gnzZ.s-tab-tieba"));
actions.contextClick(element).perform();
}
还是之前的大致操作,唯一不同的是上述代码多定位了一个元素并在该位置进行鼠标右击操作
//创建一个鼠标对象
Actions actions = new Actions(webDriver);
WebElement element = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-tieba_3gnzZ.s-tab-tieba"));
actions.contextClick(element).perform();
即这一部分,代码运行之后如图所示
可以看到在贴吧的位置执行了右击操作
三、定位一组元素
首先我们写以下页面作为选择对象
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2</label>
<div class="controls">
<input type="checkbox" id="c2" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c3">checkbox3</label>
<div class="controls">
<input type="checkbox" id="c3" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r2" />
</div>
</div>
</form>
</div>
</body>
</html>
页面如上图所示
接着我们进行编码
private static void method7(){
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开写好的html页面
webDriver.get("file:///E:/Wangjiawei_git/frontend-code-exercise/%E8%87%AA%E5%8A%A8%E5%8C%96%E9%80%89%E6%8B%A9%E5%A4%9A%E7%BB%84%E5%85%83%E7%B4%A0.html");
//获取所有的input标签元素
List<WebElement> input = webDriver.findElements(By.cssSelector("input"));
//遍历该集合,并执行需要执行的操作
for (int i = 0; i < input.size(); i++) {
if (input.get(i).getAttribute("type").equals("checkbox")){
input.get(i).click();
}
}
}
运行结果如下
此处我们可以看到页面中的多选框已经被全部点击勾选
简而言之通过findElements()方法可以定位一组(多个)元素,如同上述页面中的input标签,通过将其存储进一个list集合,然后通过遍历的方法去取出对应集合进行我们想要的逻辑与操作即可
四、多层框架/窗口定位
对于一个web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一定的困难。
1.多层框架定位
switch_to.frame(name_or_id_or_frame_element):通过frame的id或者name或者frame自带的其它属性来定位框架,这里switch_to.frame()把当前定位的主体切换了frame里。
switch_to.default_content:从frame中嵌入的页面里跳出,跳回到最外面的默认页面中。
注此处代码不做演示,且上述说明是基于Python+Selenium的自动化代码方法,如果Java想要得到相同作用应写为webDriver.switchTo().frame();
2.窗口定位
有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switch_to.window
用法与switch_to.frame 相同:
driver.switch_to.window("windowName")
五、下拉框处理
下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框对下拉框进行操作后,再定位到下拉框内里的选项。
示例
<html>
<body>
<select id="ShippingMethod"
onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod">
<option value="12.51">UPS Next Day Air ==> $12.51</option>
<option value="11.61">UPS Next Day Air Saver ==> $11.61</option>
<option value="10.69">UPS 3 Day Select ==> $10.69</option>
<option value="9.03">UPS 2nd Day Air ==> $9.03</option>
<option value="8.34">UPS Ground ==> $8.34</option>
<option value="9.25">USPS Priority Mail Insured ==> $9.25</option>
<option value="7.45">USPS Priority Mail ==> $7.45</option>
<option value="3.20" selected="">USPS First Class ==> $3.20</option>
</select>
</body>
</html>
下拉框默认选择数值3.2
通过以下代码
private static void method8(){
//创建浏览器驱动
WebDriver webDriver = new ChromeDriver();
//打开html页面
webDriver.get("file:///E:/Wangjiawei_git/frontend-code-exercise/select.html");
//操作下拉框
Select select = new Select(webDriver.findElement(By.cssSelector("#ShippingMethod")));
select.selectByValue("12.51");
}
我们可以得到结果如图所示
在这我对上述代码进行说明:
在上述方法中,我去掉了之前演示代码中的ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*");
也就是说这两行代码视情况添加,我们可以直接创建一个浏览器驱动对象,但是有可能在不进行请求参数设置时出现一些浏览器无法自动化驱动等现象,具体会怎么样我也不清楚,所以酌情处理
之后能通过css选择器定位select下拉框,并创建select对象进行操作
通过select.selectByValue("12.51");
也就是通过自己选择下拉框的value属性进行操作切换到我们想要的部分
同样我们还可以通过索引下标的方式去操作,形如这样
select.selectByIndex(2);
六、alert、confirm、prompt 的处理
- text 返回alert/confirm/prompt 中的文字信息
- accept 点击确认按钮
- dismiss 点击取消按钮,如果有的话
- send_keys 输入值,如果alert 没有对话框就不能用了,不然会报错
通过webDriver.switchTo().alert()
来进行操作
七、上传文件操作(文件提交)
文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路。
上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添
加上传文件。
其实,在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通过send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。