java用selenium庫控制chrome


一.簡介

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,表示多選的下拉列表.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM