常用API
1、浏览器窗口大小设置
// 设置浏览器宽480、高800
Dimension d = new Dimension(480, 800);
driver.manage().window().setSize(d);
// 浏览器窗口最大化
driver.manage().window().maximize();
2、浏览器页面前进后退
// 前进
driver.navigate().forward();
// 后退
driver.navigate().back();
3、浏览器页面刷新
// 刷新
driver.navigate().refresh();
4、浏览器关闭
// 关闭当前窗口
driver.close();
// 退出驱动并关闭所有关联的窗口
driver.quit();
5、脚本代码:
package com.test.api;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
/**
* 浏览器操作
*
* @author wangmcn
*
*/
public class Browser {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\\workspace2\\My_Selenium_Demo\\driver\\win\\chromedriver.exe");
ChromeOptions option = new ChromeOptions();
option.addArguments("disable-infobars");
WebDriver driver = new ChromeDriver(option);
driver.get("https://www.baidu.com/");
// 设置浏览器宽480、高800
Dimension d = new Dimension(480, 800);
driver.manage().window().setSize(d);
Thread.sleep(2000);
// 浏览器窗口最大化
driver.manage().window().maximize();
Thread.sleep(2000);
driver.get("https://cn.bing.com");
Thread.sleep(2000);
// 刷新
driver.navigate().refresh();
Thread.sleep(2000);
// 后退
driver.navigate().back();
Thread.sleep(2000);
// 前进
driver.navigate().forward();
Thread.sleep(2000);
// 关闭当前窗口
driver.close();
Thread.sleep(2000);
// 退出驱动并关闭所有关联的窗口
driver.quit();
}
}
如图所示:带有标签的下拉菜单选择页面源码
1、使用Select类来处理下拉菜单
Select sel = new Select(driver.findElement(By.id("select-demo")));
// 通过value来选择,例如:香蕉
sel.selectByValue("banana");
// 通过index来选择(从0开始),例如:葡萄
sel.selectByIndex(2);
// 通过text来选择,例如:苹果
sel.selectByVisibleText("苹果");
2、脚本代码:
package com.test.api;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.Select;
/**
* 下拉菜单选择
*
* @author wangmcn
*
*/
public class SelectDemo {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\\workspace2\\My_Selenium_Demo\\driver\\win\\chromedriver.exe");
ChromeOptions option = new ChromeOptions();
option.addArguments("disable-infobars");
WebDriver driver = new ChromeDriver(option);
driver.get("D:\\workspace2\\My_Selenium_Demo\\html\\select.html");
Select sel = new Select(driver.findElement(By.id("select-demo")));
Thread.sleep(2000);
// 通过value来选择,例如:香蕉
sel.selectByValue("banana");
Thread.sleep(2000);
// 通过index来选择(从0开始),例如:葡萄
sel.selectByIndex(2);
Thread.sleep(2000);
// 通过text来选择,例如:苹果
sel.selectByVisibleText("苹果");
Thread.sleep(2000);
driver.quit();
}
}
Actions类提供的鼠标事件常用方法(perform()执行所有Actions中存储的行为):
Actions action = new Actions(driver);
1、双击doubleClick()
例如:双击百度搜索框
百度搜索框页面源码
// 双击操作
action.doubleClick(driver.findElement(By.id("kw"))).perform();
2、右击contextClick()
例如:百度搜索框内右击操作
// 右击操作
action.contextClick(driver.findElement(By.id("kw"))).perform();
3、悬停moveToElement()
例如:悬停设置按钮
设置页面源码
// 悬停操作
action.moveToElement(driver.findElement(By.className("pf"))).perform();
4、拖放操作dragAndDrop(ele1, ele2)
在源元素上按下鼠标左键,然后移动到目标元素上释放。
ele1:鼠标拖动的源元素。
ele2:鼠标释放的目标元素。
例如:将Drag me拖放到Item 2
页面源码
// 拖放操作
// 定位元素的源位置
WebElement ele1 = driver.findElement(By.id("dragger"));
// 定位元素要移动到的目标位置
WebElement ele2 = driver.findElement(By.xpath("//div[text()='Item 2']"));
action.dragAndDrop(ele1, ele2).perform();
5、脚本代码:
package com.test.api;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
/**
* 鼠标事件
*
* @author wangmcn
*
*/
public class MouseEvent {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\\workspace2\\My_Selenium_Demo\\driver\\win\\chromedriver.exe");
ChromeOptions option = new ChromeOptions();
option.addArguments("disable-infobars");
WebDriver driver = new ChromeDriver(option);
driver.get("https://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("Selenium");
Thread.sleep(2000);
Actions action = new Actions(driver);
// 双击操作
action.doubleClick(driver.findElement(By.id("kw"))).perform();
Thread.sleep(2000);
// 右击操作
action.contextClick(driver.findElement(By.id("kw"))).perform();
Thread.sleep(2000);
// 悬停操作
action.moveToElement(driver.findElement(By.className("pf"))).perform();
Thread.sleep(2000);
driver.get("http://sahitest.com/demo/dragDropMooTools.htm");
Thread.sleep(2000);
// 拖放操作
// 定位元素的源位置
WebElement ele1 = driver.findElement(By.id("dragger"));
// 定位元素要移动到的目标位置
WebElement ele2 = driver.findElement(By.xpath("//div[text()='Item 2']"));
action.dragAndDrop(ele1, ele2).perform();
Thread.sleep(2000);
driver.quit();
}
}
1、使用Keys类来处理键盘操作:
sendKeys(Keys.BACK_SPACE) 删除键(Backspace)
sendKeys(Keys.SPACE) 空格键(Space)
sendKeys(Keys.TAB) Tab键
sendKeys(Keys.ESCAPE) 回退键(Esc)
sendKeys(Keys.ENTER) 回车键(Enter)
sendKeys(Keys.CONTROL,"a") 全选(Ctrl+A)
sendKeys(Keys.CONTROL,"c") 复制(Ctrl+C)
sendKeys(Keys.CONTROL,"x") 剪切(Ctrl+X)
sendKeys(Keys.CONTROL,"v") 粘贴(Ctrl+V)
sendKeys(Keys.F1) 键盘F1
sendKeys(Keys.F12) 键盘F12
2、脚本代码:
package com.test.api;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
/**
* 键盘事件
*
* @author wangmcn
*
*/
public class KeyboardEvent {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\\workspace2\\My_Selenium_Demo\\driver\\win\\chromedriver.exe");
ChromeOptions option = new ChromeOptions();
option.addArguments("disable-infobars");
WebDriver driver = new ChromeDriver(option);
driver.get("https://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("Selenium");
Thread.sleep(2000);
// Ctrl+A 全选操作
driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL,"a");
Thread.sleep(2000);
// Ctrl+C 复制操作
driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL,"c");
Thread.sleep(2000);
driver.get("http://cn.bing.com");
Thread.sleep(2000);
// Ctrl+V 粘贴操作
driver.findElement(By.id("sb_form_q")).sendKeys(Keys.CONTROL,"v");
Thread.sleep(2000);
// 回车键操作
driver.findElement(By.id("sb_form_q")).sendKeys(Keys.ENTER);
Thread.sleep(2000);
driver.quit();
}
}
1、显示等待
在设定时间内,针对某一个元素,默认每隔一段时间检测该元素是否存在,如果超过设定时间检测不到则抛出异常。
WebDriverWait()
例如:
WebDriverWait(driver, 5, 1)
driver - WebDriver的驱动程序(IE、Firefox、Chrome等)
5 - 最长超时时间,默认以秒为单位
1 - 休眠时间的间隔(步长)时间,默认为0.5秒
2、隐式等待
implicitlyWait识别对象时的超时时间。超过这个时间如果对象还没有找到的话就会抛出NoSuchElement异常。
setScriptTimeout异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
pageLoadTimeout页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常。
例如:
// 定位对象时给10秒时间, 如果10秒内还定位不到则抛出异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// 异步脚本的超时时间设置成3秒
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
// 页面加载超时时间设置为5秒
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
3、sleep休眠
当执行到sleep()方法时会固定的休眠所设置的时长,然后再继续执行。
sleep()方法默认参数以毫秒为单位,1000毫秒=1秒。
例如:
Thread.sleep(2000);
4、脚本代码:
package com.test.api;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
/**
* 元素等待
*
* @author wangmcn
*
*/
public class ElementWait {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\\workspace2\\My_Selenium_Demo\\driver\\win\\chromedriver.exe");
ChromeOptions option = new ChromeOptions();
option.addArguments("disable-infobars");
WebDriver driver = new ChromeDriver(option);
driver.get("https://www.baidu.com");
// 显式等待
// 最长超时时间5秒,检测的间隔时间为1秒(默认为0.5秒)
WebDriverWait wait = new WebDriverWait(driver, 5, 1);
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("kw"))).sendKeys("Selenium");
// 隐式等待
// 定位对象时给10秒时间, 如果10秒内还定位不到则抛出异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElement(By.id("kw")).sendKeys("1");
// 异步脚本的超时时间设置成3秒
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
driver.findElement(By.id("kw")).sendKeys("2");
// 页面加载超时时间设置为5秒
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.findElement(By.id("kw")).sendKeys("3");
// sleep休眠
Thread.sleep(2000);
driver.quit();
}
}
在Web应用中经常会遇到表单嵌套页面,Frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位;而frame和iframe需要切换进去才能定位到其中的元素。这时就需要通过switchTo().frame()方法将当前定位的主体切换为 frame/iframe表单的内嵌页面中。
如图所示:输入框frame div在层frameA内,要想输入操作则需要进入层frameA。
页面源码:
1、switchTo().frame() 默认可以直接取表单的id或name属性进行切换,也可以用Xpath等。
例如:
driver.switchTo().frame("frameA");
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@src='frame2.html']")));
2、switchTo().parentFrame() 跳出当前层
3、switchTo().defaultContent() 返回最外层
4、脚本代码:
package com.test.api;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
/**
* 多表单切换
*
* @author wangmcn
*
*/
public class Frame {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\\workspace2\\My_Selenium_Demo\\driver\\win\\chromedriver.exe");
ChromeOptions option = new ChromeOptions();
option.addArguments("disable-infobars");
WebDriver driver = new ChromeDriver(option);
driver.get("D:\\workspace2\\My_Selenium_Demo\\html\\frame1.html");
driver.findElement(By.id("maininput")).sendKeys("Selenium1");
Thread.sleep(2000);
// 跳进层
driver.switchTo().frame("frameA");
driver.findElement(By.id("iframeinput")).sendKeys("Selenium2");
Thread.sleep(2000);
// 跳出当前层
driver.switchTo().parentFrame();
// 跳进层
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@src='frame2.html']")));
driver.findElement(By.id("iframeinput")).sendKeys("Selenium3");
Thread.sleep(2000);
// 返回最外层
driver.switchTo().defaultContent();
driver.quit();
}
}
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。switchTo().window()方法可以实现在不同的窗口之间切换。
getWindowHandle() 获得当前窗口句柄
getWindowHandles() 获取所有窗口句柄
switchTo().window() 切换窗口
如图所示:百度搜索页点击立即注册后,会弹出注册账号页面。
脚本代码:
package com.test.api;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
/**
* 多窗口切换
*
* @author wangmcn
*
*/
public class WindowHandles {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "D:\\workspace2\\My_Selenium_Demo\\driver\\win\\chromedriver.exe");
ChromeOptions option = new ChromeOptions();
option.addArguments("disable-infobars");
WebDriver driver = new ChromeDriver(option);
driver.get("https://www.baidu.com");
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
// 获取搜索窗口句柄
String sreach_windows = driver.getWindowHandle();
driver.findElement(By.linkText("登录")).click();
driver.findElement(By.linkText("立即注册")).click();
// 获取所有窗口句柄
Setall_handles = driver.getWindowHandles();
// 进入注册窗口页面
for(String handle : all_handles){
if (handle.equals(sreach_windows)==false){
// 切换窗口
driver.switchTo().window(handle);
driver.findElement(By.name("userName")).sendKeys("userName");
Thread.sleep(2000);
}
}
// 进入搜索窗口页面
for(String handle : all_handles){
if (handle.equals(sreach_windows)==true){
// 切换窗口
driver.switchTo().window(handle);
driver.findElement(By.className("close-btn")).click();
driver.findElement(By.id("kw")).sendKeys("Selenium");
driver.findElement(By.id("su")).click();
Thread.sleep(2000);
}
}
driver.quit();
}
}
- End -
本文分享自 AllTests软件测试 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!