目录
前言:
1、获取WebElement/WebElements
2、WebElement常用方法:
4、下拉菜单(Select)的操作(不常用)
5、Selenium窗口切换
6、Selenium框架切换
7、js框操作
8、隐式等待 implicitly Wait
9、显式等待 explicit Wait
10、Cookie操作
11、截图
12、窗口与导航
13、执行js
14、RemoteWebDriver与Grid简介
15、具体代码示例
示例
DEMO:
System.setProperty("webdriver.chrome.driver", "D:/developkit/driver/chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw1")).sendKeys("Selenium");
支持的浏览器驱动:ChromeDriver, EdgeDriver, FirefoxDriver, InternetExplorerDriver, OperaDriver, SafariDriver
最全Jar包下载:https://download.csdn.net/download/MonkeySun123321/12412733
代码示例在文章最后。
方法 |
说明 |
举例 |
调用 |
By.id |
通过id查找 |
ttttttt |
driver.findElement(By.id("msg")) |
By.linkText |
通过链接文字查找 |
driver.findElement(By.linkText("百度")) |
|
By.partialLinkText |
通过部分链接文字查找 |
driver.findElement(By.partialLinkText("百")) |
|
By.name |
通过name查找 |
tttttttt |
driver.findElement(By.name("myname")) |
By.tagName |
通过标签名查找 |
tttttttt |
driver.findElement(By.tagName("p")) |
By.xpath |
通过xpath查找 |
ttttttt |
driver.findElement(By.xpath("/p")) |
By.cssName |
通过css名查找 |
ttttttt |
driver.findElement(By.cssName("normal-text")) |
By.cssSelector |
通过css选择器查找 |
ttttttttt |
driver.findElement(By.cssSelector("#msg")) |
cssSelector的说明:http://www.w3school.com.cn/cssref/css_selectors.asp
xpath的说明:http://www.w3school.com.cn/xpath/index.asp
返回值 |
方法名 |
说明 |
void |
clear() |
如果找到的元素是input 或 textarea,则清除它的值。其他元素不受影响。 |
void |
click() |
点击一个元素,元素必须可见,并且宽高都必须大于0。如果这个点击操作导致页面刷新的话, 必须要抛弃这个元素的所有引用,并且对这个元素的进一步操作, 都会引发StaleElementReferenceException |
String |
getAttribute(String name) |
通过属性名,获得属性值。例如,我想获得value的值,可以调用getAttribute("value") |
String |
getCssValue(String propertyName) |
通过属性名,获得Css属性值,例如getCSSValue("height") |
String |
getTagName() |
获得该元素的标签名,例如input,p等 |
String |
getText() |
获取页面上可见的文字(没有被css隐藏),包括子元素,获得的文本去除任何前导或后置的空格。 例如,html源码是 aaaaa 如果我们得到的WebElement ele=driver.findElement(By.id("test")),那么ele.getText()实际输出 aaaaa bbbbb cccccc |
boolean |
isDisplayed() |
判断该元素是否可见。 |
boolean |
isEnabled() |
判断元素是否可用。 |
boolean |
isSelected() |
判断元素是否被选中,只用于单选或者多选按钮(radio button,check box) |
void |
sendKeys(CharSequence... keys) |
模拟输入字符 |
void |
submit() |
如果当前元素是一个form或者是在form内的一个元素,则会提交表单。 否则,引发NoSuchElementException |
ChromeDriver extends RemoteWebDriver, FirefoxDriver extends RemoteWebDriver,还有其他driver均是继承自RemoteWebDriver,而RemoteWebDriver implements WebDriver ,WebDriver是一个接口。关键在于RemoteWebDriver这个类。
navigate().to()实际是在调用get(url),可见driver.navigate().to()和driver.get()是一模一样的的,说起来,driver.get()还要比navigate().to()快那么一点点
方法 |
说明 |
void deselectAll() |
取消所有选择项,仅对下拉框的多选模式有效,若下拉不支持多选模式,则会抛出异常 UnsupportedOperationException(不支持的操作) |
void deselectByIndex(int index) |
取消指定index的选择,index从零开始,仅对多选模式有效,否则抛出异常 UnsupportedOperationException(不支持的操作) |
void deselectByValue(String value) |
取消Select标签中,value为指定值的选择,仅对多选模式有效,否则抛出异常 UnsupportedOperationException(不支持的操作) |
void deselectByVisibleText(String Text) |
取消项的文字为指定值的项,例如指定值为Bar,项的html为 ,仅对多选模式有效,单选模式无效,但不会抛出异常 |
List |
获得所有选中项,单选多选模式均有效,但没有一个被选中时,返回空列表,不会抛出异常 |
WebElement getFirstSelectedOption() |
获得第一个被选中的项,单选多选模式均有效,当多选模式下,没有一个被选中时,会抛出NoSuchElementException异常 |
List |
获得下拉框的所有项,单选多选模式均有效,当下拉框没有任何项时,返回空列表,不会抛出异常 |
boolean isMultiple() |
判断下拉框是否多选模式 |
void selectByIndex(int index) |
选中指定index的项,单选多选均有效,当index超出范围时,抛出NoSuchElementException异常 |
void selectByValue(String value) |
选中所有Select标签中,value为指定值的所有项,单选多选均有效,当没有适合的项时,抛出NoSuchElementException异常 |
void selectByVisibleText(String text) |
选中所有项的文字为指定值的项,与deselectByValue相反,但单选多选模式均有效,当没有适合的项时,抛出NoSuchElementException异常 |
总结:select开头的,单选多选均有效;deselect开头的,仅对多选模式有效;返回选中项的,单选多选均有效,返回List的不会抛出异常。
切换的方法有两个,一个是通过窗口标题来验证,另一个是通过窗口特定的内容来验证,这两个方法都要求得到的标题或内容是唯一的。
用到的相关方法有:
方法 |
说明 |
String getTitle() |
返回当前窗口的标题 |
String getPageSource() |
获取最后加载页面的源。如果页面在加载后被修改(例如,由JavaScript),则不能保证返回的文本是修改过的页面。 |
String getWindowHandle() |
获得能唯一标识该驱动实例的句柄 |
Set |
获得一组句柄,可用来遍历所有打开的窗口 |
WebDriver switchTo().window(String nameOrHandle) |
切换到指定窗口,如果窗口不存在,则抛出异常 NoSuchWindowException |
切换框架:是指切换html中的iframe标签元素或者frame标签元素,注意,并不包括frameset
以下是常用的方法:
方法 |
说明 |
WebDriver switchTo().frame(int index) |
通过索引切换到指定的框架,若框架不存在,则抛出异常 NoSuchFrameException |
WebDriver switchTo().frame(String nameOrId) |
通过框架的name或者id切换到指定的框架,若框架不存在,则抛出异常 NoSuchFrameException |
WebDriver switchTo().frame(WebElement frameElement) |
通过元素定位切换到该框架。若元素不稳定,则抛出StaleElementReferenceException,若框架不存在,则抛出NoSuchFrameException |
WebDriver switchTo().parentFrame() |
切换到父级框架,如果当前框架是最顶级,则不会切换。 |
WebDriver switchTo().defaultContent() |
返回到最顶级的主文档,官方还说了一种可能,就是返回第一个框架,但我暂时未找到这个例子。 |
js框,就是JavaScript中的警告框(alert),确认框(confirm),提示框(prompt)
Selenium中对js框的操作非常简单,js框在Selenium中被抽象成Alert对象,只有四个方法: void accept() :点击“确定”按钮 void dismiss() :点击“取消”按钮 Stirng getText() :获得窗口的提示信息 void sendKeys(String keysToSend) :在提示框中输入文档 在操作这些框前,当然需要先切换到他们,所以还需知道一个方法: Alert switchTo().alert() :切换到js框,并且返回一个Alert对象
driver.manage().timeouts().implicitlyWait (long time, java.util.concurrent.TimeUnit unit) * time:等待的时间长度 * unit:等待的时间单位,例如秒
当一个元素不能马上呈现时,指定driver应该等待的时间。若是单个元素的查找,driver会搜索整个页面,直到元素找到或者超过指定的时间。当超过指定时间仍未找到,则会抛出 NoSuchElementException异常。若是查找多个元素,driver会搜索整个页面,直到至少一个元素找到或者超过指定的时间。
应明智的设置等待时间,因为设置不当,会对测试运行时造成不好的影响。特别是在使用XPath这类比较慢的定位策略时,尤其需要合理使用。
简单说:如果查找单个元素,找到则马上停止,如果超过指定时间都没找到就抛出找不到的异常。如果查找多个元素,则会在指定时间内尽量查找,但不保证能找到所有。之所以要明智设置等待时间,因为这个方法对于driver来说是全局性的,每次这个driver去查找元素,都会遵循上面的方法。
driver2的隐式等待与driver无关
显式等待,其实就是在使用WebDriverWait这个对象,进行等待。显式等待对比隐式等待,多了一些人性化的设置,可以说是更细化的隐式等待。
WebDriverWait 类继承自泛型类 FluentWait
首先,我们如何得到WebDriverWait的实例呢,他的构造函数有3个。
1.WebDriverWait(WebDriver driver, Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut)
driver:这个不用说,大家都应该知道。
clock:Clock是一个接口,clock参数是用来定义超时,一般使用默认即可。关于更详细的Clock
接口,可以点击这里
sleeper:Sleeper也是一个接口,sleeper这个参数是,让当前线程进入睡眠的一个对象
timeOutInSeconds:超时的时间,单位是秒
sleepTimeOut:线程睡眠的时间,默认是500毫秒,也就是默认500毫秒执行一次
2.WebDriverWait(WebDriver driver, long timeOutInSeconds)
3.WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)
现在我们得到了WebDriverWait对象,怎么实现等待呢。刚说了,until是当中最重要的一个方法,我们看看WebDriverWait中这个until方法的定义。
public
until方法中的参数是一个Function,其中? super WebDriver是参数,表示包括WebDriver在内的所有WebDriver的父类,V是返回值的类型。
until的参数 ExpectedConditions里面的方法
http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html
public void testExplicitWait() { try { //driver.get("http://www.cnblogs.com"); driver.get("file:///E:/gitHub/study-self/javase/java/src/selenium/html/wait.html"); //定义超时4秒,默认每500毫秒轮询一次 WebDriverWait wait=new WebDriverWait(driver,4); //重新定义轮询时间,每隔1秒轮询一次 wait.pollingEvery(1000, TimeUnit.MILLISECONDS); //忽略NoSuchElementException异常 wait.ignoring(NoSuchElementException.class); //等待直到标题包含博客园 //wait.until(ExpectedConditions.titleContains("博客园")); //等待直到元素可点击 //wait.until(ExpectedConditions.elementToBeClickable(By.linkText("找找看"))); //等待直到url包含cnblogs.com //wait.until(ExpectedConditions.urlContains("cnblogs.com")); // visibilityOfElementLocated 用于检查某个元素是否出现在页面的DOM上并且可见的期望。可见性意味着不仅显示元素,而且元素的高度和宽度也大于0 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("inputID"))).sendKeys("hello,selenium"); //等待4秒,每隔1秒定位一次,直至超时或返回要找的元素 /* WebElement ele = wait.until(arg0 -> { return arg0.findElement(By.linkText("找找看")); }); ele.click();*/ } catch (Exception e) { System.out.println("查找元素超时"); } }
Selenium操作cookie非常简单,操作的方法主要有:
返回类型 |
方法和说明 |
void |
addCookie(Cookie cookie) 添加一个cookie |
void |
deleteAllCookies() 删除当前域名下的所有cookie |
void |
deleteCookie(Cookie cookie) 删除一个cookie |
void |
deleteCookieNamed(java.lang.String name) 删除一个cookie,参数是cookie名 |
Cookie |
getCookieNamed(java.lang.String name) 通过名字得到cookie |
java.util.Set |
getCookies() 获得当前域名下的所有cookie |
ChromeDriver等各类浏览器的driver都继承自RemoteWebDriver,而RemoteWebDriver实现了TakesScreenshot接口,换言之,我们常用的各种driver,ChromeDriver, EdgeDriver, FirefoxDriver, InternetExplorerDriver, OperaDriver, SafariDriver,既实现了WebDriver接口,也实现了TakesScreenshot接口,因此我们可以像使用WebDriver接口一样,使用TakesScreenshot。而TakesScreenshot接口只有一个方法:
X getScreenshotAs(OutputType target) throws WebDriverException
因此,我们可以这样使用:
//截图作为文件保存
File screenshotFile =((TakesScreenshot)driver).getScreenshotAs (OutputType.FILE);
//将图片存为base64
String screenshotBase64 = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BASE64);
公共接口OutputType
修饰符和类型 |
栏位及说明 |
static OutputType |
BASE64 获取屏幕截图作为base64数据。 |
static OutputType |
BYTES 以原始字节获取屏幕截图。 |
static OutputType |
FILE 将屏幕快照获取到一个临时文件中,一旦JVM退出,该文件将被删除。 |
而FileHandler,提供了一些静态方法,满足我们常用的文件操作需要,例如
//将一个文件复制到另一个地方 static void copy(java.io.File from, java.io.File to)
公共类FileHandler ,扩展java.lang.Object(常见文件系统活动的实用程序方法)
修饰符和类型 |
方法和说明 |
static void |
copy(java.io.File from, java.io.File to) |
static void |
copyResource(java.io.File outputDir, java.lang.Class> forClassLoader, java.lang.String... names) |
static boolean |
createDir(java.io.File dir) |
static boolean |
delete(java.io.File toDelete) |
static boolean |
isZipped(java.lang.String fileName) |
static boolean |
makeWritable(java.io.File file) |
一。窗口,也就是window,这里的窗口是指浏览器窗口。他的方法主要有:
返回类型 |
方法说明 |
void |
fullscreen() 将当前浏览器窗口最大化 |
Point |
getPosition() 获得浏览器左上角位置 |
Dimension |
getSize() 获得当前窗口的大小 |
void |
maximize() 将当前窗口最大化 |
void |
setPosition(Point targetPosition) 设置窗口的位置 |
void |
setSize(Dimension targetSize) 设置窗口的大小 |
二。而导航,也是非常简单,就是控制窗口的前进,后退,刷新等。方法主要有:
返回类型 |
方法说明 |
void |
back() 后退 |
void |
forward() 前进 |
void |
refresh() 刷新 |
void |
to(java.lang.String url) 跳转到指定url |
void |
to(java.net.URL url) 跳转到指定url |
三。driver.quit和driver.close到底有什么不同
官方的说明是:
driver.close:Close the current window, quitting the browser if it's the last window currently open.(关掉最后一个打开的窗口)
driver.quit:Quits this driver, closing every associated window.(关掉所有相关的窗口)
Selenium能够执行js,这使得Selenium拥有更为强大的能力。既然能执行js,那么js能做的事,Selenium应该大部分也能做。这应该得益于JavascriptExecutor这个接口,而ChromeDriver, EdgeDriver, EventFiringWebDriver, FirefoxDriver, InternetExplorerDriver, OperaDriver, RemoteWebDriver, SafariDriver均实现了这个接口。跟使用WebDriver一样,我们可以这样使用该接口:
WebDriver driver=new ChromeDriver(); JavascriptExecutor jsExecutor=(JavascriptExecutor) driver;
该接口十分简单,只有两个方法:
1.java.lang.Object executeScript(java.lang.String script, java.lang.Object... args) 同步执行js
2.java.lang.Object executeAsyncScript(java.lang.String script, java.lang.Object... args) 异步执行js
对于返回值:
1.如果js返回的是html元素,那么方法返回WebElement
2.如果js返回的是小数,方法返回Double
3.如果js返回的是非小数,方法返回Long
4.如果js返回的是布尔,方法返回Boolean
5.如果js返回的是其他,方法返回String
6.如果js返回的是数组,方法返回List
7.如果js返回的是map,方法返回Map
8.如果js返回null或没有返回,方法返回null
对于 arg参数:
js会用一个“魔法”变量arguments来接收。参数的类型可以是:数字,布尔,字符串,元素(WebElement)以及List
package selenium;
import org.junit.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.io.FileHandler;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import util.CollectionUtil;
import util.JacksonUtil;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
*
* Selenium入门
*
*
* @author zhaominglei
* @version 1.00.00
*
* 修改记录
* 修改后版本: 修改人: 修改日期: 修改内容:
*
*/
public class SeleniumTest {
static WebDriver driver = null;
static {
// 指定驱动位置,加载并创建driver对象
System.setProperty("webdriver.chrome.driver", "D:/developkit/driver/chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
/**
* 1、元素定位
* 2、获取WebElement (findElement/findElements)
*/
@Test
public void testElementLocator() {
// driver.get("http://www.baidu.com");
driver.navigate().to("http://www.baidu.com");
// By.Id
driver.findElement(By.id("kw")).sendKeys("Selenium");
// By.name
WebElement description = driver.findElement(By.name("description"));
System.out.println(description.getAttribute("content"));
// By.className
WebElement element = driver.findElement(By.className("s-top-wrap"));
List elements = driver.findElements(By.className("s-top-wrap"));
System.out.println(element.getAttribute("id"));
for (WebElement e : elements) {
System.out.println("Elements " + e.getAttribute("id"));
}
// By.partialLinkText
System.out.println(driver.findElement(By.partialLinkText("贴吧")).getText());
// By.cssSelector
System.out.println(driver.findElement(By.cssSelector("#s-top-left > a:nth-child(2)")).getAttribute("href"));
// By.xpath
System.out.println(driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[2]")).getAttribute("href"));
}
/**
* 3、WebElement使用及常用方法
*/
@Test
public void testElementApi() {
try {
/*
* 隐式等待,implicitlyWait()方法比sleep()方法智能,sleep()/*方法只能在一个固定的时间等待,
* 而implicitlyWait()可以在一个时间范围内等待,称为隐式等待
*/
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
driver.get("https://e.mail.sh.cn/");
//窗口最大化
driver.manage().window().maximize();
// sendKey clear
WebElement uid = driver.findElement(By.id("uid")); //账号
WebElement password = driver.findElement(By.id("password"));
uid.sendKeys("Selenium");
uid.clear();
// click
driver.findElement(By.id("languageName")).click();
driver.findElement(By.cssSelector("#mainRCommon > div > div.Header > div.select_options.localePanel > ul > a:nth-child(2) > li > span")).click();
// 方法1,强制等待,固定休眠时间设置,sleep()方法以毫秒为单位 ,此类为设置5s等待
Thread.sleep(1000);
// sendKey
driver.get("https://e.mail.sh.cn/?cus=1");
uid = driver.findElement(By.id("uid")); //账号
password = driver.findElement(By.id("password"));
uid.sendKeys("zml");
password.sendKeys("123321");
// submit不生效 使用click
driver.findElement(By.id("login_button")).click();
String text = driver.findElement(By.xpath("//*[@id=\"logArea\"]/div[3]/span")).getText();
System.out.println("输出错误信息" + text);
} catch (Exception e) {
System.out.println(e);
} finally {
driver.close();
}
}
/**
* 4、下拉菜单(Select)的操作(不常用)
*/
@Test
public void testSelectedOption() {
try {
//转到我们刚才编写的html
driver.get("E:/gitHub/study-self/javase/java/src/selenium/select.html");
driver.manage().window().maximize();
//找到下拉框元素
WebElement element = driver.findElement(By.name("phones"));
//转化为Select
Select select = new Select(element);
select.selectByValue("小米2");
//使用可见文字也可以
select.selectByVisibleText("中兴");
//使用index也可以
select.selectByIndex(0);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.close();
}
}
/**
* 5、Selenium窗口切换 driver.switchTo().window(windowHandle)
* 1.通过句柄切换
* 2.通过标题切换
* 3.通过内容切换
*/
@Test
public void testWindowSwitch() {
try {
driver.get("https://www.jd.com/");
driver.manage().window().maximize();
String currentUrl = driver.getCurrentUrl();
String title = driver.getTitle();
String windowHandle = driver.getWindowHandle();
String pageSource = driver.getPageSource();
System.out.println("当前页面url " + currentUrl);
System.out.println("当前页面title " + title);
System.out.println("当前窗口句柄 " + windowHandle); //CDwindow-4C1D098F8E8FA747A5514BF97E15A845
//System.out.println("页面内容 " + pageSource);
driver.findElement(By.xpath("//*[@id=\"J_cate\"]/ul/li[1]/a")).click();
Thread.sleep(2000);
// 1、句柄方式
driver.switchTo().window(windowHandle);
// 2、title方式
/*Set handles = driver.getWindowHandles();
for(String handler : handles){
if (driver.switchTo().window(handler).getTitle().equals(title)){
driver.switchTo().window(handler);
break;
}
}*/
// 3、pageSource方式
/*Set handles = driver.getWindowHandles();
for (String handler : handles) {
if (driver.switchTo().window(handler).getPageSource().contains("工业品")) {
driver.switchTo().window(handler);
break;
}
}*/
driver.findElement(By.partialLinkText("工业品")).click();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
driver.close();
// driver.quit();
}
}
/**
* 6、Selenium框架切换(不常用)
*/
@Test
public void testFrameSwitch() {
try {
driver.get("E:/gitHub/study-self/javase/java/src/selenium/html/frame.html");
Thread.sleep(1000);
//切换到框架2,找到文本框,输入“frame2”,首次运行,焦点默认在主文档
driver.switchTo().frame(1);
WebElement textFrame2 = driver.findElement(By.id("text1"));
textFrame2.sendKeys("frame2");
Thread.sleep(1000);
//切换到框架1,找到文本框狂,输入“frame1”
//需要先切换到最顶端文档,否则会抛出异常,找不到该框架
driver.switchTo().defaultContent();
driver.switchTo().frame(0);
WebElement textFrame1 = driver.findElement(By.id("text1"));
textFrame1.sendKeys("frame1");
Thread.sleep(1000);
//切换回最顶端文档,找到文本框,输入“main”
driver.switchTo().defaultContent();
WebElement textMain = driver.findElement(By.id("text1"));
textMain.sendKeys("main");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
driver.close();
}
}
/**
* 7、js框操作 -----警告框(alert),确认框(confirm),提示框(prompt)
*/
@Test
public void testJsAlert() {
try {
driver.get("file:///E:/gitHub/study-self/javase/java/src/selenium/html/jsAlert.html");
Thread.sleep(1000);
driver.findElement(By.id("button1")).click();
Thread.sleep(1000);
Alert alert = driver.switchTo().alert();
//alert.sendKeys("zml"); //提示框(prompt)
System.out.println(alert.getText());
//alert.accept(); //确定
alert.dismiss();
} catch (Exception e) {
e.printStackTrace();
} finally {
//driver.close();
}
}
/**
* 8、隐式等待 implicitly Wait
* 查找元素隐式等待:调用driver.manage().timeouts().implicitlyWait(long time, java.util.concurrent.TimeUnit unit)
* time:等待的时间长度
* unit:等待的时间单位,例如秒
*/
@Test
public void testImplicitWait() {
//设置隐式查找元素的等待时间是5秒
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get("http://www.cnblogs.com");
//计算查找博客园首页“找找看”链接元素的时间
Date startTime1 = new Date();
driver.findElement(By.linkText("找找看"));
Date endTime1 = new Date();
long diff1 = endTime1.getTime() - startTime1.getTime();
System.out.println("找到连接元素‘找找看’所用的时间是:" + diff1 + "毫秒");
//故意让driver去查找一个不存在的元素aaa,看看它抛出异常的时间是否跟我们设置的5秒一样
Date startTime2 = new Date();
try {
driver.findElement(By.id("aaa"));
} catch (Exception e) {
Date endTime2 = new Date();
long diff2 = endTime2.getTime() - startTime2.getTime();
System.out.println("抛出异常的时间间隔:" + diff2);
}
}
/**
* 9、显式等待 explicitly Wait
*/
@Test
public void testExplicitWait() {
try {
//driver.get("http://www.cnblogs.com");
driver.get("file:///E:/gitHub/study-self/javase/java/src/selenium/html/wait.html");
//定义超时4秒,默认每500毫秒轮询一次
WebDriverWait wait = new WebDriverWait(driver, 4);
//重新定义轮询时间,每隔1秒轮询一次
wait.pollingEvery(1000, TimeUnit.MILLISECONDS);
//忽略NoSuchElementException异常
wait.ignoring(NoSuchElementException.class);
//等待直到标题包含博客园
//wait.until(ExpectedConditions.titleContains("博客园"));
//等待直到元素可点击
//wait.until(ExpectedConditions.elementToBeClickable(By.linkText("找找看")));
//等待直到url包含cnblogs.com
//wait.until(ExpectedConditions.urlContains("cnblogs.com"));
// visibilityOfElementLocated 用于检查某个元素是否出现在页面的DOM上并且可见的期望。可见性意味着不仅显示元素,而且元素的高度和宽度也大于0
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("inputID"))).sendKeys("hello,selenium");
//等待4秒,每隔1秒定位一次,直至超时或返回要找的元素
/* WebElement ele = wait.until(arg0 -> {
return arg0.findElement(By.linkText("找找看"));
});
ele.click();*/
} catch (Exception e) {
System.out.println("查找元素超时");
}
}
/**
* 10、Cookie操作
* 1、用户名+密码+拖动滑块 登录
* 2、登录
* 3、获取cookie
* 4、页面跳转
*/
@Test
public void testCookie() {
try {
driver.get("https://shanxi/login");
Thread.sleep(2000);
clickOnHideButton(driver.findElement(By.id("login-btn")));
Thread.sleep(1000);
WebElement block = driver.findElement(By.xpath("//*[@id=\"dxDrag\"]/div[2]"));
block.click();
WebElement source = driver.findElement(By.xpath("//*[@id=\"dxDrag\"]/div[3]"));
for (int i = 0; i < 5; i++) {
move(driver, source);
String text = block.getText();
System.out.println("滑动结果:" + text);
if ("验证通过".equals(text)) {
driver.findElement(By.xpath("//*[@id=\"nsrsbh\"]")).sendKeys("xxx");
driver.findElement(By.xpath("//*[@id=\"mm\"]")).sendKeys("ppp");
driver.findElement(By.xpath("//*[@id=\"dwnsrForm\"]/div/div[7]/button")).click();
System.out.println("登录成功");
clickOnHideButton(driver.findElement(By.xpath("//*[@id=\"top\"]/div[1]/ul/li[3]/a")));
Thread.sleep(1000);
clickOnHideButton(driver.findElement(By.xpath("//*[@id=\"top\"]/div[2]/div[3]/ul/li[3]/a/img")));
Thread.sleep(1000);
Set cookies = driver.manage().getCookies();
StringBuilder sb = new StringBuilder();
for (Cookie c : cookies) {
System.out.println(c.getName() + " " + c.getValue());
sb.append(c.getName() + "=" + c.getValue() + ";");
}
String cookie = sb.toString();
System.out.println("获取的cookie值为:" + cookie);
String byForm = HttpRequestGetAndPostUtil.getByForm("https://shanxi/login", cookie);
System.out.println(byForm);
Map jsonMap = JacksonUtil.jsonToMap(byForm);
List