2016-06-28 86 views
-1

用這樣的硒點擊元素時,測試透視和不可用性之間是否存在差異:driver.findElement(By.id("foobar")).click(); 而不是使用座標和機器人類。用Selenium點擊並用機器人點擊之間的區別

示例:如果某個元素由於錯誤而無法點擊,機器人將無法點擊它。硒能夠點擊它嗎?

+0

我不明白這個問題。您是否問過如果您無法使用Robot類(?)中的座標單擊按鈕,您可以使用Selenium通過元素ID來單擊它嗎? – Taegost

+0

我試圖理解什麼是更接近(以及爲什麼)簡單的用戶點擊,機器人或硒(或Js畢竟)。 – fx86f

回答

3

硒儘可能地模仿普通用戶可以做什麼和不可以做什麼。當您使用findElement(...).click()時,如果無法執行操作,硒將引發異常。例如,如果元素存在於DOM中但未顯示,則會引發異常。並注意Selenium的.click()將嘗試滾動元素。如果您要求它點擊一個不可見的元素,但通過滾動可以看到可以看到,Selenium將滾動顯示。

另請注意,Selenium通常會採用元素的座標並在這些座標點擊一下。所以移動元素總是被findElement(...).click()(表示在this answer中)的想法是不正確的。使用findElement可最小化獲取座標和發送事件之間的窗口,但不會完全消除該事件。硒與座標一起工作的原因同樣是重現用戶的行爲。用戶會看到該元素,將鼠標移動到元素的座標上,然後單擊它。如果元素上有一個透明覆蓋層,則覆蓋層將獲得點擊,而不是元素。這是有效的,因爲Selenium點擊座標而不是直接發送點擊到您使用findElement選擇的元素。

如果使用機器人進行點擊,賭注是大致相同以上,有幾個注意事項:

  1. 試圖點擊移動元素更是一個問題,因爲時間之窗在獲取座標和執行點擊之間更大。

  2. 機器人不知道DOM是如何構造的,因此不會爲您滾動元素。

Rogério Peixoto指出,您可以使用JavaScript來執行點擊。 這將導致爲元素調用click的事件處理程序,而不管用戶是否實際上能夠訪問該元素。這可以允許點擊不可點擊的元素,但我不會這樣做,除非有最重要的原因這樣做。我已經瀏覽了Selenium的點擊和JavaScript點擊in this answer之間的區別。

+0

總是善於學習的東西,感謝更正:) –

0

使用此:

driver.findElement(By.id("foobar")).click();

意味着你會點擊與foobar ID的元素,無論它在哪裏。

如果您使用座標,如果他們改變位置,您將無法點擊該元素。

更新應答由於更新後的問題:

我不太清楚,你正在試圖獲得與此有關。

在Selenium中,如果該元素可見,則會收到點擊事件,如果不是,則會發生異常。

你可以強制使用JavaScript點擊:

WebElement element = driver.findElement(By.id("foobar")); 
((JavascriptExecutor)driver).executeScript("arguments[0].click();", element); 

但它不會觸發註冊到該按鈕的最終JavaScript事件,你必須手動啓動它。

+0

你是對的,我只是增加了一個例子來使它更具體。 – fx86f

1

如果某個元素由於錯誤而無法點擊,機器人將無法點擊它。硒能夠點擊它嗎?

這取決於什麼是阻止點擊的錯誤。我建議你幾乎在所有情況下都使用element.click(),因爲它更易於維護。對於座標點擊,如果元素移動會怎樣?然後,您必須更新您的腳本,並使用element.click()才能正常工作的新位置。座標點擊的另一個問題,如果你的元素移動而另一個移動到位呢?這可能會導致腳本失敗,但很難追查。一個例子可能是一個意外的彈出窗口,其中包含要點擊的元素。現在您的座標點擊會彈出並最終導致錯誤/失敗。如果你做element.click()你至少會得到一個錯誤,其他元素會收到點擊。然後,您可以跟蹤調試過程中遇到的情況。

1

Selenium按我的經驗單擊單擊瀏覽器窗口內的某個元素,其中Robot當時似乎點擊桌面上的任何內容。就個人而言,我會建議你儘可能使用Selenium點擊,因爲你可以指定你點擊的窗口。

相關問題