selenium1的原理就是使用js來驅動瀏覽器,因為現在基本不用,所以不做過多討論,下面是我整理的webdriver的工作原理,大致就是通過命令請求webdriver,然后webdriver通過瀏覽器的api去做操作,並返回響應結果。用的協議是json wire protocol,下面簡單畫了個流程圖,不一定准確,只是個人理解。詳細的可以參考官方W3C介紹:https://www.w3.org/TR/2016/WD-webdriver-20160120/
下面我看下webdriver和瀏覽器的信息交互:
1.啟動cmd,進入chromedriver.exe所在目錄,輸入
java -Dwebdriver.chrome.driver="chromedriver.exe" -jar D:\seleniumjar\mycorejar\selenium\selenium-server-standalone-2.47.1.jar
2.看到提示以下信息則說明啟動成功。
3.啟動后,開始編寫測試代碼
public static void testChrome() { DesiredCapabilities aDesiredcap = DesiredCapabilities.chrome(); //aDesiredcap.setBrowserName("chrome"); aDesiredcap.setPlatform(Platform.WINDOWS); WebDriver dr; try { dr = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), aDesiredcap); dr.get("http://www.baidu.com"); dr.findElement(By.id("kw")).sendKeys("qiaoyeye"); Thread.sleep(3000); dr.quit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
4.運行后,控制台打印的信息如下
由此可見,代碼的一個請求命令,webdriver都會封裝一個executing,發送過去,發送成功后,再返回一個done表示處理成功。如果發生了異常,如找不到頁面元素,則會在執行時拋異常
如果上面的看着還不夠透徹,下面我們直接用webdriver的協議提供給我們的接口去操作。
1.首先在瀏覽器輸入http://localhost:4444/wd/hub,通過以下方式拿到sessionid:fc6f9497-330f-4d6c-abe0-bd0587e57101
2.拿到session后,就可以請求拉,首先我們用接口訪問個百度,接口地址:http://localhost:4444/wd/hub/session/5c81a944-55c6-4c2a-9e01-689bc43d335d/url,請求json內容:{"url": "http://www.baidu.com/"}。post后見下圖
3.查找百度搜索的輸入框。使用接口/session/{session id}/element,post請求,json內容:
{
"using": "id",
"value": "kw"
}
4.查找到后,我們要往輸入框輸入內容,調用接口:/session/{session id}/element/{element id}/value,post請求,json內容:
{
"value": [
"qiaoyeye"
]
}
注意:element id是第三步中的響應結果json中的{"ELEMENT":"0"}0值
貼一個響應內容:
{"sessionId":"5c81a944-55c6-4c2a-9e01-689bc43d335d","status":0,"state":"success","value":{"ELEMENT":"2"},"class":"org.openqa.selenium.remote.Response","hCode":1713842970}