Selenium的简单操作
目錄
1引入jar包鏈接驅(qū)動(dòng),打開(kāi)瀏覽器
2常用Webderver對(duì)象方法
3定位元素
4對(duì)頁(yè)面元素進(jìn)行操作
5iframe處理
6獲得彈出窗口
7處理alert、confirm、prompt對(duì)話框
8操作cookies
9等待頁(yè)面元素加載完成
10利用selenium-webdriver截圖
背景
之 所以要學(xué)習(xí)selenium,是因?yàn)樽罱拥揭豁?xiàng)工作任務(wù),爬取支付寶登錄用戶的數(shù)據(jù),支付寶依然是通過(guò)cookie中的信息記錄用戶的狀態(tài),所以我只需 要獲取支付寶完整的cookie就可以橫行霸道,但這丫的反爬機(jī)制做的非常變態(tài),在登錄的過(guò)程中有大量的js計(jì)算以及js跳轉(zhuǎn),且在跳轉(zhuǎn)的過(guò)程中創(chuàng)建 cookie,導(dǎo)致我獲取的cookie不完全,被支付寶給拒絕訪問(wèn),最后通過(guò)selenium模擬瀏覽器登錄的方式解決
1引入jar包鏈接驅(qū)動(dòng),打開(kāi)瀏覽器
(1)引入依賴
| ?????<dependency>??????????<groupId>org.seleniumhq.selenium</groupId>??????????<artifactId>selenium-java</artifactId>??????????<version>2.53.0</version>??????????<!--?對(duì)應(yīng)火狐45.0.1版本?-->??????????<!--?對(duì)應(yīng)chrome48至51版本?-->??????</dependency>?????????????<!--?apache工具包?-->????<dependency>????????<groupId>org.apache.commons</groupId>????????<artifactId>commons-lang3</artifactId>????????<version>3.4</version>????</dependency> |
(2)創(chuàng)建不同版本的驅(qū)動(dòng),打開(kāi)對(duì)應(yīng)的瀏覽器,在此只介紹firefox和chrome的驅(qū)動(dòng)鏈接,其他的如IE, HtmlUnit(×××面瀏覽器)等,可以查看鏈接http://www.51testing.com/html/05/n-2420905.html
? ? chrome方式 (注:此為window平臺(tái),且要保證chrome瀏覽器安裝在默認(rèn)位置)
| ????????//設(shè)置chrome的全局參數(shù)?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為驅(qū)動(dòng)位置??驅(qū)動(dòng)下載地址https://pan.baidu.com/s/1bpgG98F????????System.setProperty("webdriver.chrome.driver","D:/software/Applications/chromedriver.exe");????????//創(chuàng)建一個(gè)?ChromeDriver?的接口,用于連接?Chrome????????WebDriver?webDriver=new?ChromeDriver();????????//進(jìn)入百度????????webDriver.get("http://www.baidu.com");????????try?{????????????//睡眠3秒????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}????????//關(guān)閉瀏覽器????????webDriver.quit(); |
? ? firefox方式
| ????????//參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創(chuàng)建一個(gè)?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//進(jìn)入百度????????webDriver.get("http://www.baidu.com");????????try?{????????????//睡眠3秒????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}?????????//關(guān)閉瀏覽器????????webDriver.quit(); |
2常用Webderver對(duì)象方法?
此處以火狐接口為例,chrome通用
| ????????//?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創(chuàng)建一個(gè)?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//(1)跳轉(zhuǎn)路徑→進(jìn)入百度????????webDriver.get("http://www.baidu.com");????????//(2)導(dǎo)航路徑→進(jìn)入淘寶???webDriver.get()和webDriver.navigate().to()其實(shí)功能一樣,只不過(guò)”get()”拼寫(xiě)起來(lái)更簡(jiǎn)單,????????//但是webDriver.navigate()可以控制瀏覽器的前進(jìn)和后退????????webDriver.navigate().to("http://www.taobao.com");????????//(3)獲取當(dāng)前url????????String?curUrl=?webDriver.getCurrentUrl();????????System.out.println(curUrl);//輸出為:http://www.taobao.com????????//(4)獲取當(dāng)前頁(yè)面標(biāo)題????????String?curTitle=webDriver.getTitle();????????System.out.println(curTitle);//輸出為:淘寶網(wǎng)?-?淘!我喜歡????????//(5)獲取當(dāng)前頁(yè)面的html內(nèi)容????????String?curHtml=webDriver.getPageSource();????????System.out.println(curHtml);//輸出太多··占位置··你們自己看吧????????//(6)后退一頁(yè)????????webDriver.navigate().back();????????//(7)前進(jìn)一頁(yè)????????webDriver.navigate().forward();????????//(8)返回當(dāng)前的瀏覽器的窗口句柄????????webDriver.getWindowHandle();????????//(9)返回當(dāng)前的瀏覽器的所有窗口句柄????????webDriver.getWindowHandles();????????try?{????????????//休眠3秒????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}????????//退出瀏覽器????????webDriver.quit(); |
3定位元素
| ????????//?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創(chuàng)建一個(gè)?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//(1)跳轉(zhuǎn)路徑→進(jìn)入本文章頁(yè)面????????webDriver.get("http://www.like666.com/2016/07/19/selenium-webdriver的簡(jiǎn)單操作說(shuō)明/");????????try?{????????????//休眠3秒,等待元素加載完畢,后續(xù)有講解其他方式等待元素加載????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}????????//WebDriver通過(guò)findElement()和findElements()獲取單個(gè)以及多個(gè)元素,通過(guò)By對(duì)象來(lái)定位元素的位置,當(dāng)沒(méi)有獲取到元素時(shí)????????//,會(huì)引發(fā)org.openqa.selenium.NoSuchElementException異常,需要捕捉處理????????//(1)className:此時(shí)獲取類樣式包含'hfeed'的元素????????WebElement?e1=webDriver.findElement(By.className("hfeed"));????????//獲取該元素的id屬性????????System.out.println(e1.getAttribute("id"));//輸出為page????????//(2)id:此時(shí)獲取屬性id='page'的元素????????WebElement?e2=webDriver.findElement(By.id("page"));????????//獲取該元素的class屬性????????System.out.println(e2.getAttribute("class"));//輸出為hfeed?site????????//(3)cssSelector:此時(shí)獲取包含類樣式為hfeed的div元素????????WebElement?e3=webDriver.findElement(By.cssSelector("div.hfeed"));????????//獲取該元素的id屬性????????System.out.println(e3.getAttribute("id"));//輸出為page????????//(4)name:獲取name='generator'的元素,當(dāng)有多個(gè)時(shí),取第一個(gè)????????WebElement?e4=webDriver.findElement(By.name("generator"));????????//獲取該元素的content屬性????????System.out.println(e4.getAttribute("content"));//輸出為WordPress?4.5.3????????//(5)tagName:獲取標(biāo)簽為script的元素,當(dāng)有多個(gè)時(shí),取第一個(gè)????????WebElement?e5=webDriver.findElement(By.tagName("script"));????????//獲取該元素的type屬性????????System.out.println(e5.getAttribute("type"));//輸出為text/javascript????????//(5)xpath:獲取根元素下body元素下第一個(gè)div元素????????WebElement?e6=webDriver.findElement(By.xpath("//body/div[1]"));????????//獲取該元素的id屬性????????System.out.println(e6.getAttribute("id"));//輸出為page????????//退出瀏覽器????????webDriver.quit(); |
4對(duì)頁(yè)面元素進(jìn)行操作
| ????????//?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創(chuàng)建一個(gè)?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//跳轉(zhuǎn)路徑→進(jìn)入本文章頁(yè)面????????webDriver.get("https://www.baidu.com/");????????try?{????????????//休眠3秒,等待元素加載完畢,后續(xù)有講解其他方式等待元素加載????????????TimeUnit.SECONDS.sleep(3);????????????//(1)輸入框:根據(jù)id找到輸入框????????????WebElement?e1?=webDriver.findElement(By.id("kw"));????????????//設(shè)值????????????e1.sendKeys("www.like666.com");????????????//得到設(shè)入的值????????????String?text=e1.getText();????????????System.out.println(text);????????????//(2)按鈕:找到'百度一下'按鈕????????????WebElement?e2?=webDriver.findElement(By.id("su"));????????????//點(diǎn)擊提交????????????e2.click();????????????//還有很多其他方法????????????e1.clear();//清空文本框內(nèi)容,或單選項(xiàng)的選中項(xiàng)或復(fù)選框的選中項(xiàng)????????????e1.isSelected();//判斷某個(gè)單選框,復(fù)選框,下拉框是否選中????????????e1.isEnabled();//判斷某個(gè)單選框,復(fù)選框,下拉框是否啟用????????????e1.submit();//提交表單??只對(duì)表單元素type為submit的標(biāo)簽有效果?????????????????????????TimeUnit.SECONDS.sleep(3);????????????//退出瀏覽器????????????webDriver.quit();????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????} |
5iframe處理
有 時(shí)候我們?cè)诙ㄎ灰粋€(gè)頁(yè)面元素的時(shí)候發(fā)現(xiàn)一直定位不了,反復(fù)檢查自己寫(xiě)的定位器沒(méi)有任何問(wèn)題,代碼也沒(méi)有任何問(wèn)題。這時(shí)你就要看一下這個(gè)頁(yè)面元素是否在一個(gè) iframe中,這可能就是找不到的原因之一。如果你在一個(gè)default content中查找一個(gè)在iframe中的元素,那肯定是找不到的。反之你在一個(gè)iframe中查找另一個(gè)iframe元素或default content中的元素,那必然也定位不到。
selenium webdriver中提供了進(jìn)入一個(gè)iframe的方法:
WebDriverorg.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)
也提供了一個(gè)返回default content的方法:
WebDriver org.openqa.selenium.WebDriver.TargetLocator.defaultContent()
這樣使我們面對(duì)iframe時(shí)可以輕松應(yīng)對(duì)。
以下面的html代碼為例,我們看一下處現(xiàn)iframe。
Html代碼
??main.html
| <html>???<head>???????<title>FrameTest</title>???</head>???<body>?????????<div?id?=?"id1">this?is?a?div!</div>???????<iframe?id?=?"frame"?frameborder="0"?scrolling="no"style="left:0;position:absolute;"?src?="frame.html"></iframe>???</body></html> |
?frame.html
| <html>???<head>???????<title>this?is?a?frame!</title>???</head>???<body>?????????<div?id?=?"div1">this?is?a?div,too!</div>?????????<label>input:</label>?????????<input?id?=?"input1"></input>???</body></html> |
Java代碼
| ????????//?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//將main.html和freme.html放入D盤根目錄????????WebDriver?webDriver?=?new?FirefoxDriver();????????String?url?=?"D:/main.html";????????webDriver.get(url);????????//在defaultcontent定位id="id1"的div????????webDriver.findElement(By.id("id1"));????????//此時(shí),沒(méi)有進(jìn)入到id="frame"的frame中時(shí),以下兩句會(huì)報(bào)錯(cuò)????????webDriver.findElement(By.id("div1"));//報(bào)錯(cuò)????????webDriver.findElement(By.id("input1"));//報(bào)錯(cuò)????????//進(jìn)入id="frame"的frame中,定位id="div1"的div和id="input1"的輸入框。????????webDriver.switchTo().frame("frame");????????webDriver.findElement(By.id("div1"));????????webDriver.findElement(By.id("input1"));????????//此時(shí),沒(méi)有跳出frame,如果定位defaultcontent中的元素也會(huì)報(bào)錯(cuò)。????????webDriver.findElement(By.id("id1"));//報(bào)錯(cuò)????????//跳出frame,進(jìn)入defaultcontent;重新定位id="id1"的div????????webDriver.switchTo().defaultContent();????????webDriver.findElement(By.id("id1"));?????????????????//switch_to方法會(huì)new1個(gè)TargetLocator對(duì)象,使用該對(duì)象的frame方法可以將當(dāng)前識(shí)別的”主體”移動(dòng)到需要定位的frame上去。 |
6獲得彈出窗口
Html代碼
| <span?style="white-space:?normal;background-color:?#ffffff;">test.html</span>????<html>?????<head><title>Test?Popup?Window</title></head>?????<body>?????????<a?id?=?"51"?href?=?"http://www.51.com/"?target?="_blank">Let's?go!</a>?????</body>??</html> |
Java代碼
| ????????//?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????WebDriver?dr?=?new?FirefoxDriver();????????String?url?="D:/main.html";????????dr.get(url);????????dr.findElement(By.id("51")).click();????????//得到當(dāng)前窗口的句柄????????String?currentWindow?=?dr.getWindowHandle();????????//得到所有窗口的句柄????????Set<String>?handles?=?dr.getWindowHandles();????????Iterator<String>?it?=?handles.iterator();????????while(it.hasNext()){????????????if(currentWindow==?it.next())????????????????continue;????????????dr.switchTo().window(it.next());????????}??????????????????/**?????????*?捕獲或者說(shuō)定位彈出窗口的關(guān)鍵在于獲得彈出窗口的句柄。(?????????在上面的代碼里,使用windowhandle方法來(lái)獲取當(dāng)前瀏覽器窗口的句柄,使用了windowhandles方法獲取所有彈出的瀏覽器窗口的句柄,然后通過(guò)排除當(dāng)前句柄的方法來(lái)得到新開(kāi)窗口的句柄。?????????在獲取新彈出窗口的句柄后,使用switchto.window(newwindow_handle)方法,將新窗口的句柄作為參數(shù)傳入既可捕獲到新窗口了。?????????如果想回到以前的窗口定位元素,那么再調(diào)用1次switchto.window方法,傳入之前窗口的句柄既可達(dá)到目的。?????????*/ |
7處理alert、confirm、prompt對(duì)話框
Dialogs.html ?
| <html>?????<head>?????????<title>Alert</title>?????</head>?????<body>?????????<input?id?=?"alert"?value?=?"alert"?type?="button"?onclick?=?"alert('歡迎!請(qǐng)按確認(rèn)繼續(xù)!');"/>????????<input?id?=?"confirm"?value=?"confirm"?type?=?"button"?onclick?=?"confirm('確定嗎?');"/>?????????<inputid?=?"prompt"?value?=?"prompt"?type?=?"button"onclick?=?"var?name?=?prompt('請(qǐng)輸入你的名字:','請(qǐng)輸入??你的名字');?document.write(name)?"/>??????????????</body>??</html> |
Java
| ????????//?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????WebDriver?dr?=?new?FirefoxDriver();????????String?url?=?"file:///C:/Documents?and?Settings/gongjf/桌面/selenium_test/Dialogs.html";//"/Your/Path/to/main.html"????????dr.get(url);????????//點(diǎn)擊第一個(gè)按鈕,輸出對(duì)話框上面的文字,然后叉掉????????dr.findElement(By.id("alert")).click();????????Alert?alert?=?dr.switchTo().alert();????????String?text?=?alert.getText();????????System.out.println(text);????????alert.dismiss();????????//點(diǎn)擊第二個(gè)按鈕,輸出對(duì)話框上面的文字,然后點(diǎn)擊確認(rèn)????????dr.findElement(By.id("confirm")).click();????????Alert?confirm?=?dr.switchTo().alert();????????String?text1?=?confirm.getText();????????System.out.println(text1);????????confirm.accept();????????//點(diǎn)擊第三個(gè)按鈕,輸入你的名字,然后點(diǎn)擊確認(rèn),最后????????dr.findElement(By.id("prompt")).click();????????Alert?prompt?=?dr.switchTo().alert();????????String?text2?=?prompt.getText();????????System.out.println(text2);????????prompt.sendKeys("jarvi");????????prompt.accept();???????????????????/**?????????*?getText()????得到它的文本值?????????accept()??????相當(dāng)于點(diǎn)擊它的"確認(rèn)"?????????dismiss()?????相當(dāng)于點(diǎn)擊"取消"或者叉掉對(duì)話框?????????sendKeys()?輸入值,這個(gè)alert\confirm沒(méi)有對(duì)話框就不能用了,不然會(huì)報(bào)錯(cuò)。?????????*/ |
8操作cookies
| ????????//?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????WebDriver?dr?=?new?FirefoxDriver();????????//進(jìn)入百度????????dr.get("https://www.baidu.com");????????//增加一個(gè)name?="name",value="value"的cookie????????Cookie?cookie?=?new?Cookie("name",?"value");????????dr.manage().addCookie(cookie);????????//得到當(dāng)前頁(yè)面下所有的cookies,并且輸出它們的所在域、name、value、有效日期和路徑????????Set<Cookie>cookies?=?dr.manage().getCookies();????????System.out.println(String.format("Domain->?name?->?value?->?expiry?->?path"));????????for(Cookie?c?:?cookies)????????????System.out.println(String.format("%s->?%s?->?%s?->?%s?->?%s",????????????????????c.getDomain(),c.getName(),?c.getValue(),c.getExpiry(),c.getPath()));????????//刪除cookie有三種方法????????//第一種通過(guò)cookie的name????????dr.manage().deleteCookieNamed("CookieName");????????//第二種通過(guò)Cookie對(duì)象????????dr.manage().deleteCookie(cookie);????????//第三種全部刪除????????dr.manage().deleteAllCookies(); |
9等待頁(yè)面元素加載完成
| ???????//1線程等待?但不確定元素是否在等待結(jié)束后已經(jīng)加載完成,只是預(yù)估時(shí)間?????????????????try?{????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}????????//2隱性等待,是指當(dāng)要查找元素,而這個(gè)元素沒(méi)有馬上出現(xiàn)時(shí),告訴WebDriver查詢Dom一定時(shí)間。默認(rèn)值是0,但是設(shè)置之后,這個(gè)時(shí)間將在WebDriver對(duì)象實(shí)例整個(gè)生命周期都起作用????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.ex");????????WebDriver?dr?=?new?FirefoxDriver();????????//設(shè)置10秒????????dr.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); |
10利用selenium-webdriver截圖
????????//?參數(shù)1為驅(qū)動(dòng)類型??參數(shù)2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創(chuàng)建一個(gè)?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//跳轉(zhuǎn)路徑→進(jìn)入淘寶頁(yè)面????????webDriver.get("https://www.taobao.com/");????????try?{????????????TimeUnit.SECONDS.sleep(5);????????//下面代碼是得到截圖并保存在D盤下????????????File?screenShotFile?=?((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);????????????FileUtils.copyFile(screenShotFile,?new?File("D:/test.png"));????????????webDriver.quit();????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}catch?(IOException?e)?{????????????e.printStackTrace();????????}轉(zhuǎn)自:http://www.like666.com/2016/07/19/selenium-webdriver%E7%9A%84%E7%AE%80%E5%8D%95%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E/?
轉(zhuǎn)載于:https://blog.51cto.com/simplelife/1880279
總結(jié)
以上是生活随笔為你收集整理的Selenium的简单操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux 编译内核
- 下一篇: 表中记录查询排序(设置排序规则)