Selenium Webdriver學習記錄(一):環境搭建(Java+Maven+Eclipse+Selenium3.x)+第一個測試demo+部分問題解決

1.Selenium的學習網站:

    官網:http://www.seleniumhq.org/docs/

    中文網站:易百教程-->Selenium教程:http://www.yiibai.com/selenium/

2.搭建環境

    準備:安裝了Maven插件的Eclipse

    (1).新建一個Maven工程:File->New->Project,然後選擇Maven Project,如下圖:


然後一路Next(選擇默認工作區間workspace location),直到下一個界面,需要輸入Group Id和Artifact Id,按自己喜好,一般Artifact Id會成爲工程名,Group Id和Artifact Id會組成包名,例如我填寫的如下左圖,最後生成的工程目錄如下右圖所示:

                       

 (2).修改pom.xml文件,爲工程添加selium依賴包,在默認的pom.xml的<dependencies>模塊中添加一個新的<dependency>,我使用的是最新的selenium,已經到3.4.0了,如果又有更新了,你可以在http://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java裏找到最新版本,如下圖所示:


選擇3.4.0,進入可以看到該版本的相關詳細信息,並且在下方它給我們提供了maven支持的添加dependence的配置,我們可以直接複製然後粘貼到pom.xml中去:


添加到pom.xml中後,直接點擊“保存”,Maven就會自動去下載和拉取相應的依賴庫。

3.編寫第一個測試demo

    編寫第一個測試demo,在src/main/java/selenium/WebDriverTest/下有個默認的類App.java,現在我們在這個目錄下新建一個我們自己的java類,我取名爲Demo1,在Demo1中我使用了ChromeDriver,代碼如下(代碼中有註釋):

package selenium.WebDriverTest;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Demo1 {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//如果測試的瀏覽器沒有安裝在默認目錄,那麼必須在程序中設置 
		//bug1:System.setProperty("webdriver.chrome.driver", "C://Program Files (x86)//Google//Chrome//Application//chrome.exe");
		//bug2:System.setProperty("webdriver.chrome.driver", "C://Users//Yoga//Downloads//chromedriver_win32//chromedriver.exe");
		System.setProperty("webdriver.chrome.driver", "D://tanzhenTest//chromedriver_win32//chromedriver.exe");
		
		WebDriver driver = new ChromeDriver();
		driver.get("https://www.baidu.com");
		// 獲取 網頁的 title  
        System.out.println("The testing page title is: " + driver.getTitle()); 
        
		driver.quit();
	}
}

然後運行,會彈出chrome瀏覽器的界面,然後馬上變成百度首頁,並在控制檯如程序要求有以下輸出:



程序執行成功!

4.問題解決

在進行第3步- 編寫第一個測試demo時我遇到以下一些問題,並加以解決,如果你遇到類似問題,希望可以幫到你。

(1).雖然chrome正常啓動了,但是並沒有執行get百度首頁的操作,控制檯當然也沒有打印信息,報錯信息如下:

[12140:12000:0605/224013.947:ERROR:cache_util_win.cc(20)] Unable to move the cache: 5
[12140:12000:0605/224013.947:ERROR:cache_util.cc(134)] Unable to move cache folder C:\Users\Yoga\AppData\Local\Google\Chrome\User Data\ShaderCache\GPUCache to C:\Users\Yoga\AppData\Local\Google\Chrome\User Data\ShaderCache\old_GPUCache_000
[12140:12000:0605/224013.947:ERROR:disk_cache.cc(132)] Unable to create cache
[12140:12000:0605/224013.947:ERROR:shader_disk_cache.cc(593)] Shader Cache Creation failed: -2
Exception in thread "main" org.openqa.selenium.WebDriverException: Timed out waiting for driver server to start.
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'LENOVO-PC', ip: '192.168.56.1', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_51'
Driver info: driver.version: ChromeDriver
	at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:193)
	at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:181)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:78)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
	at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:250)
	at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:236)
	at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:137)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:184)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:171)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)
	at selenium.WebDriverTest.Demo1.main(Demo1.java:17)
Caused by: org.openqa.selenium.net.UrlChecker$TimeoutException: Timed out waiting for [http://localhost:25606/status] to be available after 20012 ms
	at org.openqa.selenium.net.UrlChecker.waitUntilAvailable(UrlChecker.java:107)
	at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:190)
	... 10 more
Caused by: com.google.common.util.concurrent.UncheckedTimeoutException: java.util.concurrent.TimeoutException
	at com.google.common.util.concurrent.SimpleTimeLimiter.callWithTimeout(SimpleTimeLimiter.java:140)
	at org.openqa.selenium.net.UrlChecker.waitUntilAvailable(UrlChecker.java:80)
	... 11 more
Caused by: java.util.concurrent.TimeoutException
	at java.util.concurrent.FutureTask.get(Unknown Source)
	at com.google.common.util.concurrent.SimpleTimeLimiter.callWithTimeout(SimpleTimeLimiter.java:128)
	... 12 more

從報錯可以看出chromedriver無法調用,因爲我筆記本上裝有chrome瀏覽器,所以一開始我以爲在配置測試的瀏覽器時System.setProperty()中填入的就是我筆記本上chrome的安裝位置,即最開始代碼中是這樣的:System.setProperty("webdriver.chrome.driver", "C://Program Files (x86)//Google//Chrome//Application//chrome.exe");經查閱得知selenium操作chrome瀏覽器是通過chromedriver這樣一個東西,所以還必須下載對應的瀏覽器driver,然後配置時使用這個就行了,即代碼改爲:System.setProperty("webdriver.chrome.driver", "D://tanzhenTest//chromedriver_win32//chromedriver.exe");。下載chromedriver的網址在:https://chromedriver.storage.googleapis.com/index.html

(2).當我將System.setProperty中的chrome.exe換成chromedriver.exe以後,運行程序,同樣彈出了chrome瀏覽器,但依然不能訪問百度,瀏覽器上出現了類似“xxx不安全xxx”字樣,控制檯有以下錯誤:

Starting ChromeDriver (v2.9.248315) on port 42166
六月 05, 2017 10:55:37 下午 org.openqa.selenium.remote.ProtocolHandshake createSession
信息: Detected dialect: OSS
Exception in thread "main" org.openqa.selenium.WebDriverException: java.net.SocketException: Connection reset
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'LENOVO-PC', ip: '192.168.56.1', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_51'
Driver info: driver.version: RemoteWebDriver
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:91)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
	at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:364)
	at selenium.WebDriverTest.Demo1.main(Demo1.java:18)
Caused by: java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(Unknown Source)
	at java.net.SocketInputStream.read(Unknown Source)
	at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
	at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
	at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:282)
	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
	at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
	at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
	at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165)
	at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
	at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
	at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
	at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
	at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
	at org.openqa.selenium.remote.internal.ApacheHttpClient.fallBackExecute(ApacheHttpClient.java:139)
	at org.openqa.selenium.remote.internal.ApacheHttpClient.execute(ApacheHttpClient.java:87)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:161)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
	... 3 more

或者這樣的錯誤:

unknown error: Runtime.executionContextCreated has invalid ‘context’: {“auxData”:{“frameId”:”11740.1”,”isDefault”:true},”id”:1,”name”:”“,”origin”:”://”} 
(Session info: chrome=xx.xx 
(Driver info: chromedriver=2.9.248307,platform=Windows xx) 
則原因是chromedriver和chrome版本不匹配,老版本的chromedriver無法正常啓動chrome,解決辦法還是在這個網址上下載最新的chromedriver:https://chromedriver.storage.googleapis.com/index.html,注意這裏chromedriver不是按版本順序排列的,我開始以爲是,就下載了最下面的版本是2.9,結果上面還有更新的版本,最新到2.29,如下圖所示:


在notes.txt中可以詳細說明了各個版本的chromedriver和chrome瀏覽器的配套關係,查閱notes.txt可以知道例如2.29版本的driver就適配至chrome 58

----------ChromeDriver v2.29 (2017-04-04)----------
Supports Chrome v56-58
Resolved issue 1521: Assignment to Object.prototype.$family causes a crash [['Pri-1']]
Resolved issue 1482: Chromedriver cannot handle the alert generated by onbeforeunload event [['OS-All', 'Pri-2']]
Resolved issue 1315: |switch_to.window| does not visually switch tabs [['OS-All', 'Pri-3']]
換成最新的2.29版本的chromedriver後,上述問題就解決了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章