一.簡介
selenium是瀏覽器自動化工具,可以通過程序來控制瀏覽器行為,這就是selenium!你可以用它做任何你想做的事情.很多時候人們用它測試web應用,但selenium的用途絕不僅限於此.selenium擁有大多數瀏覽器廠商的支持,它可以驅動大多數瀏覽器.selenium的原理很簡單,瀏覽器本身就提供了自動化接口,selenium只是把這些接口封裝了一下,以統一的形式來編程,不必每個瀏覽器編一套程序.
selenium-RemoteControl已經被slenium-WebDriver所替代,selenium-RC已經不鼓勵使用了.selenium IDE是一個firefox插件,可以方便地錄制用戶操作,是一個可視化插件.
要想使用selenium控制瀏覽器,可能需要瀏覽器提供的相應的驅動程序,如chrome就需要chrome-driver.在selenium官網上提供了與selenium有關的第三方工具.http://docs.seleniumhq.org/download/
selenium對於firefox支持得最好,有一個firefox插件selenium IDE,這個插件只能在firefox下使用.
selenium的主要用途是測試軟件,當然也可以干別的事.比如爬取需要手動輸入驗證碼的網站.
selenium是用java語言編寫的,但是提供java,C#,python,nodeJS等語言的調用接口,也有第三方實現的selenium接口.
selenium可以通過命令行方式交互式執行,也可以通過編寫程序執行.
htmlUnit是一個用java語言編寫的模擬瀏覽器,但是它不是真正的瀏覽器,它連個界面都沒有,只是一個模擬的瀏覽器.它對於js和css支持的不夠完善,功能上肯定比不上真正的瀏覽器,但是它速度快,有時候是非常有用的.關鍵是它是基於java的瀏覽器.在使用selenium時,瀏覽器就可以使用htmlUnit作為瀏覽器,它的優點就是速度快.
二.下載
1.下載chrome-webdriver
在selenium官網上的download頁面中提供了chrome-webdriver的下載鏈接.
https://sites.google.com/a/chromium.org/chromedriver/downloads
如果這個鏈接失效了,請百度"selenium chrome"
如果不下載chrome-webdriver,而直接寫chrome.exe的路徑,會報錯
[1020:6356:1004/173348:ERROR:cache_util_win.cc(20)] Unable to move the cache: 0
[1020:6356:1004/173348:ERROR:cache_util.cc(134)] Unable to move cache folder C:\Users\weidiao\AppData\Local\Google\Chrome\User Data\ShaderCache\GPUCache to C:\Users\weidiao\AppData\Local\Google\Chrome\User Data\ShaderCache\old_GPUCache_000
[1020:6356:1004/173348:ERROR:cache_creator.cc(134)] Unable to create cache
[1020:6356:1004/173348:ERROR:shader_disk_cache.cc(589)] Shader Cache Creation failed: -2
2.下載jar包
可以使用maven,selenium-server這個jar包依賴selenium-java這個jar包,selenium-java又依賴大量的其他庫.使用maven可以省去許多時間.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>MySel20Proj</groupId> <artifactId>MySel20Proj</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> <version>3.0.0-beta4</version> </dependency> </dependencies> </project>
因為selenium-java依賴的庫特別多,所以需要導入很多jar包.從官網上下載selenium-java,把解壓后文件夾中的全部jar包導入即可開始編寫java代碼了.
三.第一個selenium程序
public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C:\\Users\\weidiao\\Desktop\\chromedriver_win32\\chromedriver.exe"); WebDriver webDriver = new ChromeDriver(); webDriver.manage().window().maximize(); webDriver.get("http://www.baidu.com"); WebElement kw = webDriver.findElement(By.id("kw")); kw.sendKeys("暗算"); WebElement su = webDriver.findElement(By.id("su")); su.click(); //webDriver.close(); System.out.println("Hello World!"); }
運行這個程序,就會打開百度,輸入"暗算",點擊搜索按鈕.
四.API簡介
要看selenium api,不要看博客,直接去官網上的documents頁面查看api.
1.等待某個條件完成
有時需要等待瀏覽器運行js結束之后,再分析html頁面.new出來一個WebDriverWait對象,調用它的until(ExpectedCondition<>condition)函數.
// Google's search is rendered dynamically with JavaScript. // Wait for the page to load, timeout after 10 seconds (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver d) { return d.getTitle().toLowerCase().startsWith("cheese!"); } });
2.獲取元素
//通過id WebElement element = driver.findElement(By.id("coolestWidgetEvah")); //通過className List<WebElement> cheeses = driver.findElements(By.className("cheese")); //通過tagName WebElement frame = driver.findElement(By.tagName("iframe")); //通過name WebElement cheese = driver.findElement(By.name("cheese")); //通過linkText <a href="http://www.google.com/search?q=cheese">cheese</a> WebElement cheese = driver.findElement(By.linkText("cheese")); //通過部分linkText <a href="http://www.google.com/search?q=cheese">search for cheese</a> WebElement cheese = driver.findElement(By.partialLinkText("cheese")); //通過css <div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div> WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));
//通過xpath,比較麻煩
//通過javaScript
WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
List<WebElement> labels = driver.findElements(By.tagName("label")); List<WebElement> inputs = (List<WebElement>) ((JavascriptExecutor)driver).executeScript( "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" + "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels);
3.操作元素
一個WebElement可以對應html很多控件,如按鈕,單選按鈕(select和deselect,click),復選按鈕(跟單選按鈕差不多),表單(submit),文件上傳可以進行上傳文件(sendKeys)
除了WebElement還有Select,表示多選的下拉列表.