selenium3 + java 日志

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);

转载于:https://my.oschina.net/mexiaobai1315/blog/3009267

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值