环境搭建
selenium 2.53
selenium-java-2.53.0.jar
selenium-java-2.53.0-srcs.jar 原代码包
拷贝的工程lib下,做build path,告诉项目jar包在lib里
关联原始代码:
jar包里都是.class文件,想看原始代码,关联源代码包,在selenium项目包右键属性,选java source attachment,选择selenium-java-2.53.0-srcs.jar。
package com.thoughtworks.selenium 源代码
package org.openqa.selenium 开源的代码
一个driver是一个浏览器实例,
selenium2.4.5-javadoc/index.html: api文档
构造方法重载:不同的方式构造实例
FirefoxDriver()
FirefoxDriver(Capabilities desiredCapabilities)
FirefoxDriver(Capabilities desiredCapabilities, Capabilities requiredCapabilities)
FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile)
FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile, Capabilities capabilities)
FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile, Capabilities desiredCapabilities, Capabilities requiredCapabilities)
FirefoxDriver(FirefoxProfile profile)
package test.selenium;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;public classSeleniumTest {public static voidmain(String[] args) {//TODO Auto-generated method stub
WebDriver driver = newFirefoxDriver();
driver.get("http://nvsm.cnki.net/KNS/");
driver.close();
}
}
如果出现打不开浏览器,地址栏不能输入,操作不了页面dom,都是selenium版本和浏览器版本不匹配。selenium更新版本比浏览器慢,不能保证支持最新的浏览器版本。selenium2.53可以支持Firefox40以下版本。
Webdriver基础API - 浏览器实例管理
public class FirefoxDriver extends RemoteWebDriver
public class RemoteWebDriver extends java.lang.Object implements WebDriver
如果需要用的Firefox特殊的方法,需强制类型转换
appium和selenium用的是一套webdriver协议(多态)
执行程序每次打开的都是一个全新的没有设置的Firefox浏览器,设置不会在下次生效。selenium只会在默认路径(C:\Program Files (x86)\Mozilla Firefox\firefox.exe)找Firefox,如果安装位置不在默认路径则会报找不到Firefox可执行文件的错误。
举例:让selenium找的Firefox安装位置
System.setProperty("webdriver.firefox.bin","C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
WebDriver driver= newFirefoxDriver();
driver.get("http://nvsm.cnki.net/KNS/");
举例:构造浏览器实例
FirefoxBinary(java.io.File pathToFirefoxBinary)
FirefoxBinary ffb = new FirefoxBinary(new File("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"));
WebDriver driver= new FirefoxDriver(ffb,null);
driver.get("http://nvsm.cnki.net/KNS/");
举例:构造浏览器实例(带配置文件的情况,利用存在的profile文件)
FirefoxProfile(java.io.File profileDir)
FirefoxProfile作用:保存用户配置信息,包括:浏览器设置信息,插件以及设置,书签和历史记录,用户名和密码,临时文件和网站数据,cookies。
cmd命令行输入:firefox.exe -ProfileManage
C:\Program Files (x86)\Mozilla Firefox>firefox.exe -ProfileManage
运行输入:%APPDATA%,打开C:\Users\PC\AppData\Roaming,所有的用户配置信息都在:C:\Users\PC\AppData\Roaming\Mozilla\Firefox\Profiles\1h1iplez.default
FirefoxProfile ffp = new FirefoxProfile(new File("C:\\Users\\PC\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\1h1iplez.default"));
WebDriver driver= newFirefoxDriver(ffp);
driver.get("http://nvsm.cnki.net/KNS/");
举例:构造浏览器实例(带配置文件的情况,自定义profile文件启动)
FirefoxProfile有3个重载的方法:
void
setPreference(java.lang.String key, boolean value)
Set a preference for this particular profile.
void
setPreference(java.lang.String key, int value)
Set a preference for this particular profile.
void
setPreference(java.lang.String key, java.lang.String value)
Set a preference for this particular profile.
浏览器地址栏输入:about:config,设置所有的属性和插件配置
浏览器相关配置:browser
例如:设置启动默认页面:browser.startup.homepage
FirefoxProfile ffp = newFirefoxProfile();
ffp.setPreference("browser.startup.homepage", "http://nvsm.cnki.net/KNS/"); //设置启动页
ffp.setPreference("browser.startup.page", 1); //0空白首页设置不生效 1用户自定义首页
WebDriver driver = new FirefoxDriver(ffp);
Webdriver设置Firefox无提示默认路径下载
FirefoxProfile ffp = newFirefoxProfile();
ffp.setPreference("browser.download.dir", "C:\\");
ffp.setPreference("browser.download.folderList", 2);//设置浏览器默认下载文件夹 0桌面 1我的下载 2自定义
ffp.setPreference("browser.download.manager.showWhenStarting", false);
ffp.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream, application/vnd.ms-excel, text/csv, application/zip");
WebDriver driver= new FirefoxDriver(ffp);
firebug插件,网络查看资源包括静态资源和js代码加载快慢,刷新地址可生成网络布图,资源加载的时间,参数可以输出成har文件,可以用showslow打开
举例:自动收集页面加载时序图
FirefoxProfile ffp = newFirefoxProfile();
ffp.addExtension(new File("source\\firebug-2.0.17.xpi"));
ffp.addExtension(new File("source\\netExport-0.8.xpi"));//插件相关
ffp.setPreference("extensions.firebug.allPagesActivation", "on"); //所有页面自动开启
ffp.setPreference("extensions.firebug.net.enableSites", "true"); //网络设置成开启
ffp.setPreference("extensions.firebug.defaultPanelName","net");
ffp.setPreference("extensions.firebug.netexport.alwaysEnableAutoExport","true");
ffp.setPreference("extensions.firebug.netexport.saveFiles","true");
ffp.setPreference("extensions.firebug.netexport.defaultLogDir", "C:\\");
WebDriver driver= newFirefoxDriver(ffp);
Thread.sleep(2000);
driver.get("http://nvsm.cnki.net/KNS/");
Driver常用方法(浏览器相关操作)
与导航地址栏相关:
get  地址栏输入地址:driver.get("http://nvsm.cnki.net/kns/brief/result.aspx?dbprefix=CJFQ");
网页的资源都加载完毕,selenium捕获网页状态,都加载完成方法结束,未加载完会等待默认等待60s,仍未加载完成会向上抛出页面加载超时的异常。
navigate
back  回退
forward  前进
to  和driver.get()效果差不多,get更成熟
fresh  刷新
getCurrentUrl  尽量不用页面某个ui元素作为验证点
getPageSource  获取网页的原始代码
driver.get("http://nvsm.cnki.net/KNS/"); System.out.println(driver.getPageSource());
Pattern p= Pattern.compile("");
Matcher m=p.matcher(driver.getPageSource());while(m.find())
{
String aa=m.group();//System.out.println(aa);
String[] ss = aa.split("\"");for(String s:ss)
{if(s.contains("http://"))
{
System.out.println(s);
driver.get(s);
Thread.sleep(5000);
}
}
}
}
getTitle  相对用的较少
manage  driver.manage() 返回值类型是Options:
driver.manage().addCookie(cookie);
driver.manage().window().maximize();
driver.manage().window().fullscreen();
System.out.println(driver.manage().window().getSize().height);
System.out.println(driver.manage().window().getSize().width);
driver.manage().window().setSize(new Dimension(400,800));
driver.manage().timeouts(); //脚本执行超时限制
quit/close
quit   断掉http会话
close  关闭当前浏览器打开窗口
查询页面元素
driver.findElement(By):查询单个对象,查询了多个则selenium返回第一个对象
通过id:前端页面可以没有页面元素,有元素就是唯一的id,不会重复
通过Name:Name属性可以重复
通过className:class属性的值,class是给页面一批元素添加一类class属性
通过LinkText:和之间的内容
通过PartialLinkText:部分文本值
通过XPATH:
通过CSS选择器(忽略)
通过TagName:可以用TagName先缩小范围
组合-连续查找:在findElement找的元素之后,在子元素下继续查询元素,缩小范围
复合元素以及多对象定位:driver.findElements(By)
方法的返回值类型为webElement对象的list(集合形式)
操作页面元素
基本控件的调用方法:
输入框:input   --   sendkeys
clear
input 标签
id 属性
user 属性值
type 属性
text 属性值
FirefoxProfile ffp = newFirefoxProfile();
ffp.setPreference("browser.startup.homepage", "http://nvsm.cnki.net/KNS/"); //设置启动页
ffp.setPreference("browser.startup.page", 1); //0空白首页设置不生效 1用户自定义首页
WebDriver driver = newFirefoxDriver(ffp);
driver.get("http://nvsm.cnki.net/kns/brief/result.aspx?dbprefix=CJFQ");
driver.findElement(By.id("txt_1_value1")).sendKeys("期刊");
WebDriver driver = newFirefoxDriver();
driver.get("http://nvsm.cnki.net/kns/brief/result.aspx?dbprefix=CJFQ");
WebElement we= driver.findElement(By.id("txt_1_value1"));
we.click();
we.clear();
we.sendKeys("期刊");
超链接:a  --  click
获取属性
baidutarget="_blank" 每次点都打开新页签 selenium称窗口切换,selenium无法自动切换
可以取href的地址填的地址栏中,操作完再回退至之前的窗口。
WebElement we1 = driver.findElement(By.linkText("新型出版模式介绍"));
we1.click();
WebElement we2= driver.findElement(By.partialLinkText("导航"));
we2.click();
WebElement we2 = driver.findElement(By.partialLinkText("导航"));
System.out.println(we2.getAttribute("href"));
String daohang= we2.getAttribute("href");
driver.get(daohang);
Thread.sleep(2000);
driver.navigate().back();
下拉菜单:select
WebElement we3 = driver.findElement(By.id("txt_1_sel"));
Selectselect = newSelect(we3);
List list = select.getOptions();for(int i = 0;i
{
WebElement we4= list.get(i);
we4.click();
Thread.sleep(3000);
}select.selectByVisibleText("全文");
Thread.sleep(2000);select.selectByValue("DOI$=|??");int num =list.size();int random = newRandom().nextInt(num);select.selectByIndex(num);
单选:radiobox
多选:checkbox  --  click
isSelected
List list = driver.findElements(By.xpath("/html/body/form/div[4]/div[2]/div/dl/dd/dl/dd[4]/input"));
System.out.println(list.size());for(int i=2;i
{
list.get(i).click();
Thread.sleep(1000);
System.out.println(list.get(i).getAttribute("id"));
System.out.println(list.get(i).isSelected());
}
button  --   click
isEnable :判断页面的按钮是否是可点击的
有可能自动化和手动点击的操作不同,询问能否绕过选择其他方式(回车,提交的接口,触发链接,js,浏览器刷新)。
获取对象属性或文本值
getAttribute()  取属性名称
getText()  取文本值
WebDriver driver = newFirefoxDriver();
driver.get("http://www.huicewang.com/ecshop/");
driver.manage().window().maximize();//切换精品推荐页签
List elements = driver.findElements(By.xpath("//*[@id=\"itemBest\"]/h2/a"));for(WebElement we:elements)
{
we.click();
Thread.sleep(1000);//取各页签中商品价格
List prices = driver.findElements(By.xpath("//*[@id=\"show_best_area\"]/div[@class=\"goodsItem\"]/font"));
System.out.println(prices.size());for(WebElement price:prices)
{
System.out.println(price.getText());
}//取商品的图片地址
List photos = driver.findElements(By.xpath("//*[@id=\"show_best_area\"]/div[@class=\"goodsItem\"]/a/img"));for(WebElement photo:photos)
{
System.out.println(photo.getAttribute("src"));
}
}
用java.net包发http请求,检查地址返回值是否是200,保证展示正确。
高级应用
事件操作
Actions类:
位置:org.openqa,selenium.interactions.Actions
作用: