1.下载
网址:http://www.seleniumhq.org/download/
根据自己的语言,下载正确的版本,由于本人是java出身,python还只是入门级别,所以不班门弄斧,下面的所有diamante均基于
java.由于写博客时候已经是3的版本了,所以就以3的版本来讲。
下载完包以后,解压出来即可。
2.Selenium模拟登陆
新建java项目,将上面解压出来的包里的jar都放进项目中build path。(太基础了,不多讲了)
以代码讲:
java
public static void main(String[] args){
/*
创建环境变量,即浏览器执行程序,这里一定要注意,下载驱动的时候,根据自己的浏览器版本下载,我的chrom浏览器是51
版本的,所以下载的是2.22版本,。附上下载地址:
http://chromedriver.storage.googleapis.com/index.html
不知道下载那个版本,就随便进一个,看看他的notes.txt文件,里面有说版本
*/
System.setProperty("webdriver.chrome.driver",
"D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
/*根据环境变量,可以获取到chrom的驱动*/
ChromeDriver chromeDriver = new ChromeDriver();
//前往页面,下面的页面是10086云的一个登录页,姑且拿来使用
chromeDriver.get("https://ecloud.10086.cn:31015/op-user-sso/login?
service=https%3A%2F%2Fecloud.10086.cn%3A31015%2Flogin%2Fcas");
//有点类似于与jquery获取页面元素
WebElement username = chromeDriver.findElement(By.id("username"));
username.sendKeys("里面写用户名");
//密码
WebElement password = chromeDriver.findElement(By.id("password"));
password.sendKeys("里面写密码");
//找到提交按钮
WebElement btn = chromeDriver.findElement(By.name("submit"));
//点击提交
btn.click();
//关闭浏览器
chromeDriver.close();
}
3.WebDriver API
从selenium2就有了,功能强大,反正比selenium-RC强。
3.1Selenium-WebDriverAPI命令和操作:
3.1.1 操作页面:
我们使用selenium的最想做的事,就是模拟用户能操作真实的页面。最简单的操作一个页面的方式就是get()方法。例如:
chromDriver.get("http://www.baidu.com")
3.1.2定位元素(WebElements)
WebDriver提供了八种元素定位:
chromDriver.findElementById(id)
chromDriver.findElement(By.id("id"))
最常用的,也不容易出错
chromeDriver.findElementByClassName(className);
chromDriver.findElement(By.className(className))
一般是使用findElements时候回使用className来做条件
chromeDriver.findElementByCssSelector(using);
chromeDriver.findElementByLinkText(using);
chromDriver.findElement(By.linkText(linkText))
针对a标签的,用a标签内的展示名做查询,例如:
<a href="www.baidu.com">百度一下</a>
<a href="www.chrom.com">谷歌一下</a>
那么我们可以chromDriver.findElementByLinText("百度一下");
chromeDriver.findElementByName(using)
chromDriver.findElement(By.name(name))
也比较常用,根据页面元素的name属性查找
chromeDriver.findElementByPartialLinkText(using)
chromDriver.findElement(By.partialLinkText(linkText))
类似于findElementByLinkText,不过他针对的是内容太长的时候,例如:
<a href="www.baidu.com">百度一下下下下下下下下下下下下下下下下下下下下</a>
<a href="www.chrom.com">谷歌一下下下下下下下下下下下下下下下下下下下下</a>
那么我们可以chromeDriver.findElementByPartialLinkText("百度")
chromeDriver.findElementByTagName(using)
chromDriver.findElement(By.tagName(tagName))
根据标签的类型,比较不准确,看具体使用场景
chromeDriver.findElementByXPath(using)
chromDriver.findElement(By.Xpath(Xpath))
Xpath的形式太过于强大,所以之后单独留一部分讲吧。
3.1.3 获取元素的文本值:
例如:<a id="my" href="www.baidu.com">百度一下</a>
File f = new File("D:/hello.html");
System.setProperty("webdriver.chrome.driver",
"D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get(f.getAbsolutePath());
String text = chromeDriver.findElement(By.id("my")).getText();
System.out.println(text);
3.1.4 下拉菜单选择:
例如:页面为
<select>
<option value ="1">1</option>
<option value ="2">2</option>
<option value ="3">3</option>
<option value ="4">4</option>
</select>
测试程序:
WebElement select = chromeDriver.findElement(By.tagName("select"));
List<WebElement> allOptions = select.findElements(By.tagName("option"));
for (WebElement option : allOptions) {
System.out.println(String.format("Value is: %s", option.getAttribute("value")));
option.click();
}
当然,WebDriver也提供了封装函数:
Select ss = new Select(chromeDriver.findElement(By.tagName("select")));
if(ss.isMultiple()){
System.out.println("多选");
ss.deselectAll();//表示全选
ss.selectByVisibleText("1");//表示选指定的option
}
3.1.5 window窗口或者iframe切换
iframe切换
①单层嵌套iframe
<a href="http://www.baidu.com" target="myIframe">Look</a>
<iframe height="1000" width="1000" name="myIframe"></iframe>
java代码
File f = new File("D:/hello.html");
System.setProperty("webdriver.chrome.driver",
"D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get(f.getAbsolutePath());
//点击a标签
WebElement a = chromeDriver.findElement(By.linkText("Look"));
a.click();
//获取iframe中的元素
WebElement iframe = chromeDriver.switchTo().frame(target).findElement(By.id("su");
String value = iframe.getAttribute("value")
//结果就是“百度知道”
//但是这时我们是处于iframe中,并不是处于原来的hello.html中,再操作原来的页面的元素,就会空指针,或者
//org.openqa.selenium.NoSuchElementException这个报错。
//我们可以使用chromeDriver.switchTo().defaultContent()回到原来的页面hello.html
chromeDriver.switchTo().defaultContent();
②多层嵌套
selenium提供了:
chromeDriver.switchTo().parentFrame();
它可以从当前iframe退回到上一层iframe,如果当前已经是根文件了,那么就无效
不过我们也是可以继续使用上述的:
chromeDriver.switchTo().frame(target)
来指定所希望跳转到的iframe标识。
多窗口切换:
getWindowHandle() 获得当前窗口句柄
getWindowHandles() 返回的所有窗口的句柄到当前会话
switchTo().window() 用于切换到相应的窗口,与switchTo().frame()是类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。
3.1.6 弹出对话框等警告框
具体的做法就是首先stitchTo,然后定位到适当的操作上,例如alert/confirm/prompt,例如:
Alert alert = driver.switchTo().alert();
然后对于获取到的对象进行 text/accept/dismiss/sendKeys等操作,但是不能瞎写
3.1.7 控制浏览器的前进和后退
//后退
driver.navigate().back();
//前进
driver.navigate().forward();
其实访问页面时候我们调用的get方法也是navigate锁可以实现的功能,而且二者都是完成一样的功能,唯一不同的就是,写的方式不同
driver.get("www.baidu.com")
driver.navigate.get("www.baidu.com")
//下面的是刷新页面,类似于F5
driver.navigate().refresh();
这个方法用于刷新页面。
3.1.8 Cookies
直接上代码吧
登录的就不写了,本业最顶上就有个。
Set<Cookie> cookies = chromeDriver.manage().getCookies();
cookies.stream().forEach((Cookie c)->{
System.out.println(c.getName() + " : " + c.getValue());
});
//添加cookie
chromeDriver.manage().addCookie(new Cookie("键","值"));
//删除cookie,一共三种方法:
①By name
driver.manage().deleteCookieNamed("CookieName");
③Cookie
driver.manage().deleteCookie(Cookie对象);
③Or all of them
driver.manage().deleteAllCookies();
3.1.9 改变用户代理(知道有这个东西就好了)
FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile);
3.1.10 鼠标事件(包含元素的拖拽,右键,悬停等操作)
鼠标事件可以分为如下的:
contextClick() 右击
clickAndHold() 鼠标悬停
move_to_element() 鼠标悬停
doubleClick() 双击
dragAndDrop() 拖动
release() 释放鼠标
perform() 执行所有 Actions 中存储的行为
①右击
Action action = new Action(chromDriver);
action.contextClick(WebElement).perform() ---入参就是要被执行右击的元素
②悬停
Action action = new Action(chromDriver);
action.clickAndHold(WebElement).perform()
dragAndDrop函数的第一个参数标识起始位置,第二个参数是目标位置
③鼠标的拖拽
WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();
④释放鼠标
用于释放鼠标事件
其他的不做介绍了
3.1.11 键盘事件
System.setProperty("webdriver.chrome.driver", "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get("http://www.baidu.com");
WebElement input = chromeDriver.findElement(By.id("kw"));
input.sendKeys("piemon");
//输入一个空行
input.sendKeys(Keys.SPACE);
//回退格,就像删除键
input.sendKeys(Keys.BACK_SPACE);
//全部选定与剪切复制
input.sendKeys(Keys.CONTROL,"a");
input.sendKeys(Keys.CONTROL,"x");
input.sendKeys(Keys.CONTROL,"v");
//提交
//通过回车键盘来代替点击操作
input.sendKeys(Keys.ENTER);
其他的还有:
sendKeys(Keys.F1) ----F1只是样例
3.1.12 获得验证信息
getTitle() 用于获得当前页面的标题。
getCurrentUrl() 用户获得当页面的 URL。
getText() 用于获取元素的文本信息。
一些我们可能用到的数据方法
3.1.13 浏览器窗口大小控制和浏览器相对屏幕的位置
//设置页面的大小,全屏可以使用maximize()方法
driver.manage().window().setSize(new Dimension(361, 361));
//设置页面的相对位置
chromeDriver.manage().window().setPosition(new Point(100, 100));
3.1.14 简单元素操作
clear() 清除文本,如果是一个文件输入框
sendKeys(*value) 在元素上模拟按键输入
click() 单击元素
常用的一些其他方法:
submit()
submit只要是来提交我们表单的,但是有时我们的页面上输入框输入值以后回车就进行了提交,也是可以使用submit的,下面我们一baidu的主页
做测试
```java
System.setProperty("webdriver.chrome.driver",
"D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get("http://www.baidu.com");
WebElement keyWord = chromeDriver.findElement(By.id("kw"));
keyWord.sendkeys("java");
keyWord.submit();
```
有些时候 submit()可以与 click()方法互换来使用,submit()同样可以提交一个按钮.
System.setProperty("webdriver.chrome.driver",
"D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get("http://www.baidu.com");
WebElement keyWord = chromeDriver.findElement(By.id("kw"));
keyWord.sendKeys("hero");
WebElement submit = chromeDriver.findElement(By.id("su"));
submit.submit(); //这里也可以用submit.click()
getSize() 返回元素的尺寸。
getAttribute(name) 获得属性值。
isDisplayed() 设置该元素是否用户可见。
3.1.15 设置元素等待
WebDriver 提供了几种方法来等待元素
implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常
setScriptTimeout。异步脚本的超时时间。webdriver 可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间
pageLoadTimeout。页面加载时的超时时间。因为 webdriver 会等页面加载完毕在进行后面的操作,所以如果页面在这个超时时间内没有加载完
成,那么 webdriver 就会抛出异常
程序的休眠,即线程sleep
但是sleep是由java源码提供,即手动调用Thread.sleep(2000);
3.1.16 上传文件
①sendKeys上传
针对form表单提交文件的操作,例如:
<form action"/upload" method="post">
上传:<input type="file" value="upload" id="upload" />
<input type="submit" value="提交" id="submit">
</form>
chromeDriver.findElement(By.id("upload")).sendKeys("这里写个上传的文件的全路径")
chromeDriver.findElement(By.id("submit")).click();
3.1.17 文件下载
System.setProperty("webdriver.chrome.driver", "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get("http://start.spring.io/");
chromeDriver.findElement(By.name("generate-project")).click();
3.1.18 调用 JavaScript
System.setProperty("webdriver.chrome.driver", "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get("http://start.spring.io/");
WebElement a = chromeDriver.findElement(By.linkText("Switch to the full version."));
a.click();
chromeDriver.executeScript("你的JS脚本");
3.1.19 截图
chromeDriver.get("http://www.baidu.com");
WebElement keyWord = chromeDriver.findElement(By.id("kw"));
keyWord.sendKeys("王者荣耀");
keyWord.sendKeys(Keys.ENTER);
File file = chromeDriver.getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(file,new File("d:\\screenshot.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3.1.20 关闭窗口
quit/close
quit仅仅可以退出单个页面
close可以关闭多个打开的window
3.1.21验证码的处理
没有方法 - -。
4. WebDriver 原理
基于client-server模式
我们启动的chrome浏览器就是server端,而我们写的java代码,就是负责发送其你去的client