**帮助文档:**https://www.javadoc.io/doc/org.seleniumhq.selenium/selenium-api/2.50.1/org/openqa/selenium/WebDriver.html
1.浏览器导航
driver.navigate().back();//在浏览器历史记录中向后导航
driver.navigate().forward();//在浏览器历史记录中向前导航
driver.navigate().refresh();//刷新/重新加载网页
2.切换窗口
driver.switchTo().window("window_name");//切换到制定的window_name页面
driver.switchTo().alert();//切换到alert弹窗
driver.switchTo().activeElement();//定位到当前聚焦的元素上
driver.switchTo().defaultContent();//切换到最上层页面
driver.switchTo().frame("frame_reference");//通过id、name、element(定位的某个元素)、索引来切换到某个frame
举例:
driver.switchTo().frame(0);
driver.switchTo().frame(driver.findElement(By.tagName("iframe")));
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'x-URS-iframe')]")));
document.getElementsByTagName("iframe”)//获取页面上所有的iframe
driver.switchTo().parentFrame();//这是switch_to中独有的方法,可以切换到上一层的frame,对于层层嵌套的frame很有用
frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。
示例完整代码:
package package1;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class IframeDemo {
public static void main(String[] args) throws InterruptedException {
//加载驱动
System.setProperty("webdriver.chrome.driver","C:\\software\\chromedriver_win32\\chromedriver.exe");
//加载浏览器路径(如果不是默认安装路径)
System.setProperty("webdriver.chrome.bin","C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
//驱动实例化
WebDriver driver = new ChromeDriver();
//打开QQ邮箱登录网站
driver.get("https://mail.qq.com/");
//定位并切换到iframe
driver.switchTo().frame(driver.findElement(By.id("login_frame")));
Thread.sleep(1000);
//定位邮箱地址输入框
driver.findElement(By.id("u")).sendKeys("1096721729");
Thread.sleep(2000);
//定位密码输入框
driver.findElement(By.id("p")).sendKeys("123456");
Thread.sleep(2000);
//退出浏览器
driver.quit();
}
}
3.滚动网页
方法一:固定滑动多少像素
//向下滚动网页1500像素
JavascriptExecutor js1 = (JavascriptExecutor)driver;
js1.executeScript("scrollBy(0, 1500)");
方法二:滑动到某个元素的位置
//执行JS方法(这样视图就会自动滑动到elenext的位置) 将页面拉到底部
WebElement elenext= driver.findElement(By.xpath("//a[contains(@href,'page') and @class='n']"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", elenext);
arguments对象是所有函数中都可用的局部变量,可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:arguments[0],arguments[1],arguments[2]
//将页面滑到顶部
/*
scrollIntoView是一个与页面(容器)滚动相关的API
element.scrollIntoView() 参数默认为true
参数为true:调用该函数,页面发送滚动,使element的顶部与视图(容器)顶部对齐
参数为false:使element的底部与视图(容器)底部对齐
*/
WebElement elemore= driver.findElement(By.xpath("//a[contains(@href,'more') and contains(@class,'s-tab-more')]"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(false);", elemore);
方法三:Window.scrollTo()
/*
scrollTo() 方法可把内容滚动到指定的坐标
scrollTo(xpos,ypos)
参数描述:
xpos 必需。要在窗口文档显示区左上角显示的文档的 x 坐标。
ypos 必需。要在窗口文档显示区左上角显示的文档的 y 坐标。
*/
((JavascriptExecutor) driver).executeScript("window.scrollTo(0,document.body.scrollHeight)”);//滚动到页面最底部
((JavascriptExecutor) driver).executeScript("window.scrollTo(document.body.scrollHeight,0)”);//滚动到页面最顶部
4.等待时间
//设置等待页面完全加载的时间是10秒,如果在10秒内加载完毕,剩余时间不再等待
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
//隐式等待
//识别元素时的超时时间,总共等待10秒, 如果10秒后,元素还不存在,就会抛出异常 org.openqa.selenium.NoSuchElementException
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//显式等待,页面元素是否在页面上可用和可被单击
wait.until(ExpectedConditions.elementToBeClickable(By.className("n")));
//显式等待,页面元素在页面中存在
wait.until(ExpectedConditions.presenceOfElementLocated(By.className("n")));
//等待3秒
Thread.sleep(3000);
//异步脚本的超时时间
driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
wait.until(ExpectedConditions.textToBePresentInElementValue(By.id("kw"),"Java"));//判断输入框中是否存在指定的文本
wait.until(ExpectedConditions.textToBePresentInElement(driver.findElement(By.className("nums_text")),"百度为您找到相关结果约"));//判断元素中是否存在指定的文本
wait.until(ExpectedConditions.attributeContains(By.name("tj_login"),"href","passport.baidu.com"));//判断元素的属性值是否包含指定的文本
//等待指定的iframe可用的时候切换到它,等待时间20s
new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[contains(@id,'x-URS-iframe')]")));
5.窗口最大最小化
//使窗口最大化
driver.manage().window().maximize();
//使窗口最小化
driver.manage().window().minimize();//java没有这种方法
6.截屏
需要用到文件操作工具类(FileUtils)需要用到commons-io
//截屏操作
//截图到output
File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
try {
String savePath = "/Users/dengchunmei/test/example.jpg";
//String savePath = "D:\\example.jpg";
//复制内容到指定文件中
FileUtils.copyFile(scrFile, new File(savePath));
} catch (IOException e) {
e.printStackTrace();
}
7.js定位
String search_js = "document.getElementsByName('wd')[0].value='selenium';";
String search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';";
String button_js = "document.getElementById('su').click();";
String button_js2 = "document.getElementsByClassName('s_btn')[0].click()";
String button_js3 = "document.getElementsByClassName('bg’)[2].click()”;
String button_js4 = "document.getElementsByClassName(‘bg s_btn’)[0].click()";
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript(search_js2);
js.executeScript(button_js2);
获取元素的属性值:
String test = "return document.getElementById('su').getAttribute('value')";
String test1 = "return document.getElementById('su').className";
JavascriptExecutor js = (JavascriptExecutor)driver;
System.out.println("value is => " + js.executeScript(test1));
document.querySelectorAll('input[autocomplete]')——-包含“autocomplete”的<input>标签
document.querySelectorAll('#kw')---id为“kw”的元素
document.querySelectorAll('.s_ipt')---所有class为“s_ipt”的元素
document.querySelectorAll("input")—-所有<input>标签
document.querySelectorAll("span > input")---所有父元素为<span>的<input>元素
document.querySelectorAll("input,span")—所有<input><span>标签
document.querySelectorAll("input.s_ipt”)—-所有class为“s_ipt”的<input>元素
document.querySelectorAll("input[id='kw']”)—所有id属性值为kw的input标签
document.querySelectorAll("a[class*=c-color-t]”)---所有class属性值包含c-color-t的a标签
document.querySelectorAll("a[class='mnav c-font-normal c-color-t']”)---所有class属性值为指定值的a标签
document.querySelectorAll("a.mnav.c-font-normal.c-color-t”)--所有class属性值为指定值的a标签
document.querySelectorAll("a.mnav, a.c-color-t”)—所有class为mnav或者c-color-t的a标签
jQuery中文网 http://www.jquerycn.cn/course/jquery-sel-multipleattribute-equal-value.html
document.querySelectorAll("a[class*='c-color-t'][href*='news']”) —查找所有class包含c-color-t并且href包含news的a标签
document.querySelectorAll("div[id='u']>a[name*='tj_'][class*='l']")—查找id为u的div下的name包含tj_且class包含l的a标签
document.querySelectorAll("div[id='u']>a:nth-child(3)”)—查找id为u的div下的第三个a标签
document.querySelectorAll("div[id='wrapper']>div:nth-of-type(3) div[class='search_tool']”)—查找id为wrapper的div下的第三个div里面的class为search_tool的div元素
8.jquery定位
String search_jq = "$('.s_ipt').val('淘宝')”;//class
String button_jq = "$('#su')[0].click()”;//id
((JavascriptExecutor) driver).executeScript(search_jq);
((JavascriptExecutor) driver).executeScript(button_jq);