4.8 定位一组元素
定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数。定位一组元素一般用于以下场景:
·批量操作元素,例如勾选页面上所有的复选框。
·先获取一组元素,再从这组对象中过滤出需要操作的元素。例如定位出页面上所有的checkbox,然后选择其中的一个进行操作。
eg:
编写一个html页面。
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<title>checkbox</title>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.main.css" rel="stylesheet"/>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.main.js"></script>
<style>
.well{
width:200px;
height:300px;
margin:40 auto;
border:1px solid red;
}
.control-group{
margin-top:30px;
}
.controls{
margin-left:100px;
margin-top:-15px;
}
</style> </head>
<body> <div class="well">
<h3>checkbox</h3>
<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">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c2"/>
</div>
</div> <div class="control-group">
<label class="control-label" for="c3">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c3"/>
</div>
</div>
</form>
</div>
</body>
</html>
java代码;
package com.cy.selenium; import java.io.File;
import java.util.List; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver; public class Test03 {
public static void main(String[] args) throws InterruptedException {
System.out.println("start");
WebDriver driver = new FirefoxDriver();
File file = new File("C:/Users/Administrator/Desktop/test.html");
String filePath = file.getAbsolutePath();
driver.get(filePath);
// 通过css查找一组元素
List<WebElement> inputs = driver.findElements(By.cssSelector("input[type=checkbox]"));
for (WebElement checkbox : inputs) {
checkbox.click();
}
Thread.sleep(3000);
// 刷新
driver.navigate().refresh(); // 选择最后一个checkbox 通过xpath查找一组元素
List<WebElement> checkboxs = driver.findElements(By.xpath(".//input[@type='checkbox']"));
checkboxs.get(checkboxs.size()-1).click();
Thread.sleep(2000);
driver.close(); }
}
效果:
4.9 多表单切换
<html>
<head>
</head>
<body>
<div class="row_fluid">
<div class="span10 well">
<h3>frame</h3>
<iframe id="if" name="nf" src="http://www.baidu.com" width="1200px" height="300px"></iframe>
</div>
</div>
</body>
</html>
java代码:
package com.cy.selenium; import java.io.File; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver; public class Iframe { public static void main(String[] args) throws InterruptedException {
System.out.println("start");
WebDriver driver = new FirefoxDriver();
File file = new File("C:/Users/Administrator/Desktop/frame.html");
String filePath = file.getAbsolutePath();
driver.get(filePath); // 切换到iframe (id="if")
driver.switchTo().frame("if");
driver.findElement(By.id("kw")).sendKeys("webDrive");
driver.findElement(By.id("su")).click();
Thread.sleep(4000);
driver.close();
//退回上一级表单
// driver.switchTo().defaultContent(); } }
4.10 多窗口切换
4.11 警告框处理
在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to_alert()方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ sendKeys等方法进行操作。
·getText():返回 alert/confirm/prompt 中的文字信息。
·accept(): 接受现有警告框。
·dismiss():解散现有警告框。
·sendKeys(keysToSend): 发送文本至警告框。keysToSend:将文本发送至警告框。
eg:
package com.cy.selenium; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions; public class Alert {
public static void main(String[] args) throws InterruptedException {
System.out.println("start selenium");
WebDriver driver=new FirefoxDriver();// 用WebDriver new Firefox浏览器的驱动给变量driver,相当于driver拿到了Firefox浏览器的控制权。
driver.get("http://www.baidu.com/");
Actions action=new Actions(driver);
// 悬停在设置上
action.clickAndHold(driver.findElement(By.linkText("设置"))).perform();
// 打开搜索设置
driver.findElement(By.className("setpref")).click();
Thread.sleep(3000);
//保存设置
driver.findElement(By.className("prefpanelgo")).click();
Thread.sleep(2000);
// 接受弹框
driver.switchTo().alert().accept(); Thread.sleep(2000); driver.close(); }
}