2016-03-17 70 views
1

所以我發現如果你使用WebDriver得到頁面源代碼,你實際上得到了整個DOM的生成源(不僅僅是加載的頁面的HTML源代碼)。然後你可以使用這個String來生成一個Jsoup文檔。這很酷,因爲Jsoup在搜索元素方面比WebDriver快得多,它也有一個更好的API來執行此操作。將Jsoup「元素」轉換爲WebDriver「WebElement」?

那麼,有沒有辦法將一個Jsoup元素變成一個WebDriver WebElement?我在stackoverflow上看到有關使用方法從Jsoup文檔生成xpath的另一篇文章,但那不是我要找的,因爲WebDriver仍然需要解析頁面並使用Xpath查找元素,從而破壞了目的(除非你的porpuse純粹是使用Jsoup來實現其優越的Selector方法)。

我想嘗試和使用Jsoup爲WebDriver找到WebElements的原因是因爲在某些網站上,WebDriver非常慢(我爲一家自動化數百個第三方網站的公司工作,我們無法控制這些網站)。

回答

2

這裏似乎有交互式和非交互式工具之間的混淆。

由於不必要的和防禦性的等待和延遲,使用不正確理解的框架,並且通常由初級或外包開發人員編寫,WebDriver測試通常很慢(以我的經驗) - 但基本上也是因爲WebDriver模仿真實用戶的行爲在真實瀏覽器中「實時」,並使用API​​(基於specification)和協議與瀏覽器應用進行通信。它是互動的。

(越少,用的HtmlUnit,PhantomJS等)

相比之下,Jsoup僅僅是額外的解析能力的榮耀HTTP客戶端。它是非交互式的,最終從數據的快照字符串中獲得。我們預計它會在其特定使用情況下更快地得到更多

顯然,它們都是HTTP排序的客戶端,並且可以共享靜態Web內容,這就是爲什麼WebDriver可以傳遞數據以供Jsoup處理(儘管我從未聽說過此用例)。但是,Jsoup永遠不能將它的一個Element(一個包含某些屬性的Java快照對象)轉換爲WebDriver WebElement,它更像是一種類似於Firefox等程序中的真實互動對象的「實時」代理或Chrome。 (同樣,如此少用的HtmlUnit,PhantomJS等)


所以,你需要決定是否交互對你很重要。如果模仿真實用戶至關重要,WebDriver必須使用真正的瀏覽器「驅動」流程。

如果不是這樣,那麼您可以考慮像HtmlUnit和(特別是)PhantomJS這樣的無頭瀏覽器,因爲它們將能夠執行JavaScript並以HTTP庫和Jsoup無法執行的方式更新DOM。然後您可以將輸出傳遞給Jsoup等。

如果沿着PhantomJS路線走下去,您可以使用JavaScript API進行所有解析。請參閱:Use PhantomJS to extract html and text

對於很多人來說,交互性並不重要,並且完全放棄WebDriver並依賴庫很快。

+0

謝謝你的解釋,但我應該澄清我的意思是WebDriver速度很慢。我知道它試圖模仿一個真實世界的用戶,但在一些網站上(並且再次,我不得不在幾百個我不能控制的網站上工作),這是非常緩慢的;該頁面將被完全加載,dom已準備就緒,然而只需點擊幾下WebDriver就可以執行幾分鐘的操作。該網站必須與WebDriver發生衝突。就這樣說,它看起來像Jsoup不是答案。 – Andrio

+0

哦,我完全同意UI測試比較慢,我會第一個推薦一個純粹的HTTP替代方案,即「分鐘」非常極端。如果您能夠發佈特定的內容,我會對診斷感興趣嗎? –