Mac下配置ChromeDriver环境
ChromeDriver下载解压后,移动到 /usr/local/bin/
目录下
浏览器常用方法
- 打开网页:
driver.get("url")
driver.navigate().to("url")
- 浏览器后退
driver.navigate().back();
- 浏览器前进
driver.navigate().forward();
- 浏览器刷新
driver.navigate().refresh();
- 窗口最大化
driver.manage().window().maximize()
- 设置窗口大小
import org.openqa.selenium.Dimension;
Dimension di = new Dimension(100, 100);
driver.manage().window().setSize(di);
- 获取当前页面的URL
driver.getCurrentUrl()
- 获取当前页面的title
driver.getTitle()
WebDriver定位方式
- By.id、By.name、By.className、By.tagName
- By.linkText: 根据超链接的文本定位
- By.partialLinkText: 根据部分超链接文本定位,用于定位的文本要和其他超链接文本区分开
- By.xpath:根据xpath定位,
- By.cssSelector: 根据cssSelector定位
WebDriver常用方法
- sendKeys:输入文本
- getAttribute:获取属性值
- clear:清空文本框
- isDisplayed:判断元素是否显示
- isEnabled:判断元素是否可用
- isSelected:判断元素是否选中
- System.setProperty:设置参数
- getText:获取值
- submit:提交表单
- getWindowHandle: 获取窗口句柄
下拉列表
import org.openqa.selenium.support.ui.*;
Select se = new Select(driver.findElement(By.id("")));
Actions ac = new Actions(driver);
ac.keyDown(Keys.SHIFT).click(se.getOptions().get(0)).click(se.getOptions().get(1)).keyUp(Keys.SHIFT).perform();
}
findElements 定位一组元素
findElements可以定位相同name或类名的一组元素
import java.uitl.List;
List<WebElement> li = driver.findElements(By.className(""));
for(WebElement element: li) {
System.out.println(element.getText())
}
iframe
iframe元素会创建包含另外一个文档的内联框架,定位iframe内的元素时,需要先切换到iframe,否则会出现找不到元素的问题
driver.switchTo().frame(driver.findElement(By.id("iframe_id")));
//也可以直接通过iframe的name或ID进行定位
//driver.switchTo().frame("iframe_id_or_name");
driver.findElement(By.id("")) //定位iframe内的元素
//完成当前表单操作后,需要返回上一级表单
driver.switchTo().defaultContent();
标签无法定位的解决办法
QQ邮箱收件人地址输入框,通过input标签定位时,找不到元素,在网上找的其他解决办法。 思路是通过Actions点击元素,然后输入内容
import org.openqa.selenium.interactions.Actions
Actions ac = new Actions(dirver);
WebElement el = driver.findElement(By.id(""));
ac.click(el).sendKeys("").perform();
java执行外部程序或批处理命令
Runtime.getRuntime().exec("command")
截图,保存文件
//保存文件用到了FileUtils类,需要下载jar包
//地址:http://commons.apache.org/proper/commons-io/download_io.cgi
//把commons-io-2.4.jar 这个文件导入到你的项目中
import org.apache.commons.io.FileUtils;
File screenShot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.File);
try {
FileUtils.copyFile(screenShot, new File("save_path.png"));
}catch (IOException e) {
e.printStackTrace();
}
弹框处理
警告框 alert
警告框经常用于确保用户可以得到某些信息。 当警告框出现后,用户需要点击确定按钮才能继续进行操作
import org.openqa.selenium.Alert;
Alert alert = driver.switchTo().alert();
alert.accept(); //点击警告框的确认按钮
确认框 confirm
确认框用于使用户可以验证或者接受某些信息。 当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。
import org.openqa.selenium.Alert;
Alert alert = driver.switchTo().alert();
alert.accept(); //点击确认按钮
alert.dismiss(); //点击取消按钮
提示框 prompt
提示框经常用于提示用户在进入页面前输入某个值。 当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。
import org.openqa.selenium.Alert;
Alert alert = driver.switchTo().alert();
alert.sendKeys(""); //提示框中输入值
alert.accept(); //点击确认按钮
alert.dismiss(); //点击取消按钮
多窗口处理
webDriver的switchTo().window()可以在多个窗口直接切换
WebDriver driver = new ChromeDriver();
driver.get("http://www.sina.com.cn/");
Thread.sleep(5000);
String mainWindowHandle = driver.getWindowHandle();
// 打开其他链接
driver.findElement(By.linkText("体育")).click();
driver.findElement(By.linkText("娱乐")).click();
Set<String> set = driver.getWindowHandles();
for (String handle: set) {
if(handle.equals(mainWindowHandle)) {
driver.switchTo().window(mainWindowHandle);
Thread.sleep(2);
driver.close();
break;
}
}
元素等待
强制等待 Thread.sleep()
优点:使用简单 缺点:不能准确的掌握等待时间,大量使用会浪费时间,影响执行效率
Thread.sleep(2000); //休眠2S,单位是毫秒
隐式等待 implicitly_wait
设置一个最长的等待时间,如果在等待时间内页面加载完成,执行下一步,否则一直等到时间结束,然后执行下一步操作 只需设置一次,设置之后,在WebDriver对象实例整个生命周期都起作用 缺点:如果所需的页面元素已经加载完成,但整个网页还没有加载完成,仍要等待整个页面加载完成或超时才做执行下面的操作
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS)
显式等待 WebDriverWait
以某个元素是否显示或点击作为等待的条件,更精准的控制等待时间
new WebDriverWait(driver, 30).until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id(""))));
使用ExpectedConditions类中自带方法, 可以进行显试等待的判断。
- 页面元素是否在页面上可用和可被单击:elementToBeClickable(By locator)
- 页面元素处于被选中状态:elementToBeSelected(WebElement element)
- 页面元素在页面中存在:presenceOfElementLocated(By locator)
- 页面元素中是否包含特定的文本:textToBePresentInElement(By locator)
- 页面元素值:textToBePresentInElementValue(By locator, java.lang.String text)
- 标题 (title):titleContains(java.lang.String title)
Actions类
Actions类提供了鼠标和键盘点击的行为
import org.openqa.selenium.interactions.Actions
Actions action = new Actions(driver);
WebElemen element = driver.findElement(By.id(""));
鼠标点击
//单击
action.click(element).perform()
//右键
action.contextClick(element).perform()
//双击
action.doubleClick(element).perform()
//鼠标悬停,点击后不释放
action.clickAndHold(driver.findElement(By.id(""))).perform()
鼠标移动
//鼠标移动到元素上
action.moveToElement(element).perform();
元素移动
//将element1移动到element2位置上
action.dragAndDrop(element1, element2).perform();
//将element移动到(200,200)位置
action.dragAndDropBy(element, 200, 200).perform();
键盘输入
//输入abc然后按回车键
ac.sendKeys("abc").sendKeys(Keys.ENTER).perform();
//组合按键
ac.keyDown(Keys.SHIFT).sendKeys("a").keyUp(Keys.SHIFT).perform();
ac.sendKeys(Keys.chord(Keys.SHIFT, "a")).perform();
下拉框多选
Select se = new Select(driver.findElement(By.id("")));
ac.keyDown(Keys.SHIFT).click(se.getOptions().get(0)).click(se.getOptions().get(1)).keyUp(Keys.SHIFT).perform();
Robot类
Robot robot = new Robot();
robot.setAutoDelay(300);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);