Selenium的简单操作
目錄
1引入jar包鏈接驅動,打開瀏覽器
2常用Webderver對象方法
3定位元素
4對頁面元素進行操作
5iframe處理
6獲得彈出窗口
7處理alert、confirm、prompt對話框
8操作cookies
9等待頁面元素加載完成
10利用selenium-webdriver截圖
背景
之 所以要學習selenium,是因為最近接到一項工作任務,爬取支付寶登錄用戶的數據,支付寶依然是通過cookie中的信息記錄用戶的狀態,所以我只需 要獲取支付寶完整的cookie就可以橫行霸道,但這丫的反爬機制做的非常變態,在登錄的過程中有大量的js計算以及js跳轉,且在跳轉的過程中創建 cookie,導致我獲取的cookie不完全,被支付寶給拒絕訪問,最后通過selenium模擬瀏覽器登錄的方式解決
1引入jar包鏈接驅動,打開瀏覽器
(1)引入依賴
| ?????<dependency>??????????<groupId>org.seleniumhq.selenium</groupId>??????????<artifactId>selenium-java</artifactId>??????????<version>2.53.0</version>??????????<!--?對應火狐45.0.1版本?-->??????????<!--?對應chrome48至51版本?-->??????</dependency>?????????????<!--?apache工具包?-->????<dependency>????????<groupId>org.apache.commons</groupId>????????<artifactId>commons-lang3</artifactId>????????<version>3.4</version>????</dependency> |
(2)創建不同版本的驅動,打開對應的瀏覽器,在此只介紹firefox和chrome的驅動鏈接,其他的如IE, HtmlUnit(×××面瀏覽器)等,可以查看鏈接http://www.51testing.com/html/05/n-2420905.html
? ? chrome方式 (注:此為window平臺,且要保證chrome瀏覽器安裝在默認位置)
| ????????//設置chrome的全局參數?參數1為驅動類型??參數2為驅動位置??驅動下載地址https://pan.baidu.com/s/1bpgG98F????????System.setProperty("webdriver.chrome.driver","D:/software/Applications/chromedriver.exe");????????//創建一個?ChromeDriver?的接口,用于連接?Chrome????????WebDriver?webDriver=new?ChromeDriver();????????//進入百度????????webDriver.get("http://www.baidu.com");????????try?{????????????//睡眠3秒????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}????????//關閉瀏覽器????????webDriver.quit(); |
? ? firefox方式
| ????????//參數1為驅動類型??參數2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創建一個?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//進入百度????????webDriver.get("http://www.baidu.com");????????try?{????????????//睡眠3秒????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}?????????//關閉瀏覽器????????webDriver.quit(); |
2常用Webderver對象方法?
此處以火狐接口為例,chrome通用
| ????????//?參數1為驅動類型??參數2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創建一個?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//(1)跳轉路徑→進入百度????????webDriver.get("http://www.baidu.com");????????//(2)導航路徑→進入淘寶???webDriver.get()和webDriver.navigate().to()其實功能一樣,只不過”get()”拼寫起來更簡單,????????//但是webDriver.navigate()可以控制瀏覽器的前進和后退????????webDriver.navigate().to("http://www.taobao.com");????????//(3)獲取當前url????????String?curUrl=?webDriver.getCurrentUrl();????????System.out.println(curUrl);//輸出為:http://www.taobao.com????????//(4)獲取當前頁面標題????????String?curTitle=webDriver.getTitle();????????System.out.println(curTitle);//輸出為:淘寶網?-?淘!我喜歡????????//(5)獲取當前頁面的html內容????????String?curHtml=webDriver.getPageSource();????????System.out.println(curHtml);//輸出太多··占位置··你們自己看吧????????//(6)后退一頁????????webDriver.navigate().back();????????//(7)前進一頁????????webDriver.navigate().forward();????????//(8)返回當前的瀏覽器的窗口句柄????????webDriver.getWindowHandle();????????//(9)返回當前的瀏覽器的所有窗口句柄????????webDriver.getWindowHandles();????????try?{????????????//休眠3秒????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}????????//退出瀏覽器????????webDriver.quit(); |
3定位元素
| ????????//?參數1為驅動類型??參數2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創建一個?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//(1)跳轉路徑→進入本文章頁面????????webDriver.get("http://www.like666.com/2016/07/19/selenium-webdriver的簡單操作說明/");????????try?{????????????//休眠3秒,等待元素加載完畢,后續有講解其他方式等待元素加載????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}????????//WebDriver通過findElement()和findElements()獲取單個以及多個元素,通過By對象來定位元素的位置,當沒有獲取到元素時????????//,會引發org.openqa.selenium.NoSuchElementException異常,需要捕捉處理????????//(1)className:此時獲取類樣式包含'hfeed'的元素????????WebElement?e1=webDriver.findElement(By.className("hfeed"));????????//獲取該元素的id屬性????????System.out.println(e1.getAttribute("id"));//輸出為page????????//(2)id:此時獲取屬性id='page'的元素????????WebElement?e2=webDriver.findElement(By.id("page"));????????//獲取該元素的class屬性????????System.out.println(e2.getAttribute("class"));//輸出為hfeed?site????????//(3)cssSelector:此時獲取包含類樣式為hfeed的div元素????????WebElement?e3=webDriver.findElement(By.cssSelector("div.hfeed"));????????//獲取該元素的id屬性????????System.out.println(e3.getAttribute("id"));//輸出為page????????//(4)name:獲取name='generator'的元素,當有多個時,取第一個????????WebElement?e4=webDriver.findElement(By.name("generator"));????????//獲取該元素的content屬性????????System.out.println(e4.getAttribute("content"));//輸出為WordPress?4.5.3????????//(5)tagName:獲取標簽為script的元素,當有多個時,取第一個????????WebElement?e5=webDriver.findElement(By.tagName("script"));????????//獲取該元素的type屬性????????System.out.println(e5.getAttribute("type"));//輸出為text/javascript????????//(5)xpath:獲取根元素下body元素下第一個div元素????????WebElement?e6=webDriver.findElement(By.xpath("//body/div[1]"));????????//獲取該元素的id屬性????????System.out.println(e6.getAttribute("id"));//輸出為page????????//退出瀏覽器????????webDriver.quit(); |
4對頁面元素進行操作
| ????????//?參數1為驅動類型??參數2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創建一個?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//跳轉路徑→進入本文章頁面????????webDriver.get("https://www.baidu.com/");????????try?{????????????//休眠3秒,等待元素加載完畢,后續有講解其他方式等待元素加載????????????TimeUnit.SECONDS.sleep(3);????????????//(1)輸入框:根據id找到輸入框????????????WebElement?e1?=webDriver.findElement(By.id("kw"));????????????//設值????????????e1.sendKeys("www.like666.com");????????????//得到設入的值????????????String?text=e1.getText();????????????System.out.println(text);????????????//(2)按鈕:找到'百度一下'按鈕????????????WebElement?e2?=webDriver.findElement(By.id("su"));????????????//點擊提交????????????e2.click();????????????//還有很多其他方法????????????e1.clear();//清空文本框內容,或單選項的選中項或復選框的選中項????????????e1.isSelected();//判斷某個單選框,復選框,下拉框是否選中????????????e1.isEnabled();//判斷某個單選框,復選框,下拉框是否啟用????????????e1.submit();//提交表單??只對表單元素type為submit的標簽有效果?????????????????????????TimeUnit.SECONDS.sleep(3);????????????//退出瀏覽器????????????webDriver.quit();????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????} |
5iframe處理
有 時候我們在定位一個頁面元素的時候發現一直定位不了,反復檢查自己寫的定位器沒有任何問題,代碼也沒有任何問題。這時你就要看一下這個頁面元素是否在一個 iframe中,這可能就是找不到的原因之一。如果你在一個default content中查找一個在iframe中的元素,那肯定是找不到的。反之你在一個iframe中查找另一個iframe元素或default content中的元素,那必然也定位不到。
selenium webdriver中提供了進入一個iframe的方法:
WebDriverorg.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)
也提供了一個返回default content的方法:
WebDriver org.openqa.selenium.WebDriver.TargetLocator.defaultContent()
這樣使我們面對iframe時可以輕松應對。
以下面的html代碼為例,我們看一下處現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代碼
| ????????//?參數1為驅動類型??參數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"));????????//此時,沒有進入到id="frame"的frame中時,以下兩句會報錯????????webDriver.findElement(By.id("div1"));//報錯????????webDriver.findElement(By.id("input1"));//報錯????????//進入id="frame"的frame中,定位id="div1"的div和id="input1"的輸入框。????????webDriver.switchTo().frame("frame");????????webDriver.findElement(By.id("div1"));????????webDriver.findElement(By.id("input1"));????????//此時,沒有跳出frame,如果定位defaultcontent中的元素也會報錯。????????webDriver.findElement(By.id("id1"));//報錯????????//跳出frame,進入defaultcontent;重新定位id="id1"的div????????webDriver.switchTo().defaultContent();????????webDriver.findElement(By.id("id1"));?????????????????//switch_to方法會new1個TargetLocator對象,使用該對象的frame方法可以將當前識別的”主體”移動到需要定位的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代碼
| ????????//?參數1為驅動類型??參數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();????????//得到當前窗口的句柄????????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());????????}??????????????????/**?????????*?捕獲或者說定位彈出窗口的關鍵在于獲得彈出窗口的句柄。(?????????在上面的代碼里,使用windowhandle方法來獲取當前瀏覽器窗口的句柄,使用了windowhandles方法獲取所有彈出的瀏覽器窗口的句柄,然后通過排除當前句柄的方法來得到新開窗口的句柄。?????????在獲取新彈出窗口的句柄后,使用switchto.window(newwindow_handle)方法,將新窗口的句柄作為參數傳入既可捕獲到新窗口了。?????????如果想回到以前的窗口定位元素,那么再調用1次switchto.window方法,傳入之前窗口的句柄既可達到目的。?????????*/ |
7處理alert、confirm、prompt對話框
Dialogs.html ?
| <html>?????<head>?????????<title>Alert</title>?????</head>?????<body>?????????<input?id?=?"alert"?value?=?"alert"?type?="button"?onclick?=?"alert('歡迎!請按確認繼續!');"/>????????<input?id?=?"confirm"?value=?"confirm"?type?=?"button"?onclick?=?"confirm('確定嗎?');"/>?????????<inputid?=?"prompt"?value?=?"prompt"?type?=?"button"onclick?=?"var?name?=?prompt('請輸入你的名字:','請輸入??你的名字');?document.write(name)?"/>??????????????</body>??</html> |
Java
| ????????//?參數1為驅動類型??參數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);????????//點擊第一個按鈕,輸出對話框上面的文字,然后叉掉????????dr.findElement(By.id("alert")).click();????????Alert?alert?=?dr.switchTo().alert();????????String?text?=?alert.getText();????????System.out.println(text);????????alert.dismiss();????????//點擊第二個按鈕,輸出對話框上面的文字,然后點擊確認????????dr.findElement(By.id("confirm")).click();????????Alert?confirm?=?dr.switchTo().alert();????????String?text1?=?confirm.getText();????????System.out.println(text1);????????confirm.accept();????????//點擊第三個按鈕,輸入你的名字,然后點擊確認,最后????????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()??????相當于點擊它的"確認"?????????dismiss()?????相當于點擊"取消"或者叉掉對話框?????????sendKeys()?輸入值,這個alert\confirm沒有對話框就不能用了,不然會報錯。?????????*/ |
8操作cookies
| ????????//?參數1為驅動類型??參數2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????WebDriver?dr?=?new?FirefoxDriver();????????//進入百度????????dr.get("https://www.baidu.com");????????//增加一個name?="name",value="value"的cookie????????Cookie?cookie?=?new?Cookie("name",?"value");????????dr.manage().addCookie(cookie);????????//得到當前頁面下所有的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有三種方法????????//第一種通過cookie的name????????dr.manage().deleteCookieNamed("CookieName");????????//第二種通過Cookie對象????????dr.manage().deleteCookie(cookie);????????//第三種全部刪除????????dr.manage().deleteAllCookies(); |
9等待頁面元素加載完成
| ???????//1線程等待?但不確定元素是否在等待結束后已經加載完成,只是預估時間?????????????????try?{????????????TimeUnit.SECONDS.sleep(3);????????}?catch?(InterruptedException?e)?{????????????e.printStackTrace();????????}????????//2隱性等待,是指當要查找元素,而這個元素沒有馬上出現時,告訴WebDriver查詢Dom一定時間。默認值是0,但是設置之后,這個時間將在WebDriver對象實例整個生命周期都起作用????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.ex");????????WebDriver?dr?=?new?FirefoxDriver();????????//設置10秒????????dr.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); |
10利用selenium-webdriver截圖
????????//?參數1為驅動類型??參數2為火狐瀏覽器的安裝目錄??瀏覽器下載地址http://ftp.mozilla.org/pub/firefox/releases/45.0/????????System.setProperty("webdriver.firefox.bin","D:/software/firefox45/firefox.exe");????????//創建一個?FirefoxDriver?的接口,用于連接?firefox????????WebDriver?webDriver=new?FirefoxDriver();????????//跳轉路徑→進入淘寶頁面????????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();????????}轉自: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/?
轉載于:https://blog.51cto.com/simplelife/1880279
總結
以上是生活随笔為你收集整理的Selenium的简单操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 编译内核
- 下一篇: 表中记录查询排序(设置排序规则)