场景使用:可以当成爬虫,抓取网页数据(适用:当前网页,登陆后的当前页面。既可以做缓存也可以不做缓存直接使用)
使用方法
首先加载驱动(目前接触过IE跟Chrome)
a. 下载:IEDriverServer.exe
b. 下载:chromedriver.exe(ab二选一)
c. 下载: selenium-server-standalone-2.25.0.jar(核心jar)代码对应启动浏览器方式
a. Chrome//驱动加载 System.setProperty("webdriver.chrome.driver","C:\\driverFile\\chromedriver.exe"); //创建一个WebDriver实例 WebDriver driver=new ChromeDriver(); //打开百度网页: driver.get("www.baidu.com");
b. IE
//驱动加载 System.setProperty("webdriver.ie.driver", PropertiesUtil.getPropertyValue ("C:\\driverFile\\ IEDriverServer.exe")); DesiredCapabilities ieCapabilities =DesiredCapabilities.internetExplorer(); ieCapabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true); //IE跟谷歌的不同之处 driver = new InternetExplorerDriver (ieCapabilities); //打开百度网页: driver.get("www.baidu.com");
获取页面元素
a. 根据id/class/css/cssSelector :
//html <button id="carButton" name="carFindButton" class="labelTextMyFocus">查询</button>
//id WebElement btnId = driver. findElement (By.id("carButton")); //name WebElement btnClass =driver. findElement (By.name("carFindButton")); //class WebElement btnClass =driver. findElement (By.className("labelTextMyFocus"));
//如果class里面有空格,说明包含了两种样式,此时使用cssSelector
//例如:class="labelText ui-button" WebElement btnCss =driver. findElement (By.cssSelector("button[class='labelText ui-button']"));
b. 根据xpath(这个什么鬼元素都可以抓,炒鸡好用,所以单独拿出来说)
//html <div class="sort-opt"> <a href="yes">确定</a> </div>
//第一种 WebElement textA = driver.findElement(By.xpath("//a[text()='确定']")); //第二种 WebElement hrefA = driver.findElement(By.xpath("//a[contains(@href, 'yes')]"));
更多更详细的元素获取方法,见原创博客 http://www.cnblogs.com/qingchunjun/p/4208159.html
页面句柄转换
适用场景:利用登录(页面A),进入登录后(页面B)操作,获取当前(页面B)的元素,结果获取到的一直取不到。再或者通过B直接到C页面,多个页面操作的。这时候就需要句柄转换。public static void getWindow(WebDriver driver){ String currentWindow = driver.getWindowHandle(); //得到所有窗口的句柄 //得到当前句柄 Set<String> handles = driver.getWindowHandles(); // System.out.println("handles.size():"+handles.size()); //排除当前窗口的句柄,则剩下是新窗口 Iterator<String> it = handles.iterator(); while(it.hasNext()){ String window= it.next(); //System.out.println("window:"+ window+","); if(currentWindow == window) continue; driver.switchTo().window(window); } }
切换ifrme
适用场景:一个网页html中布局层层嵌套(好比html里面再嵌入html完整代码),代码被iframe包含,这时候iframe里面的html元素是获取不到的,需要跳转进入iframe.//html <html> html1 #document <ifrme id="mainPage"> <html> <button id="login">登录</button> </html> </iframe> <html>
//先跳转ifrme WebElement frame=driver.findElement(By.id("mainPage")); driver.switchTo().frame(frame); //获取loginButton WebElement loginBtn=driver.findElement(By.id("login"));
抓取表格数据
//html <table id="student"> <tr><td>张三</td></tr> <tr><td>女</td></tr> <tr><td>24</td></tr> </table>
List<WebElement> bodyTrs = driver.findElements(By.cssSelector(".student tr"));//table //打印出所有单元格的数据 for (WebElement tr : bodyTrs) { //得到当前tr里td的集合 List<WebElement> bodyTds = tr.findElements(By.tagName("td")); for (WebElement bodyTd : bodyTds) { System.out.print(bodyTd.getText()+" "); //得到td里的文本 } } }