用這樣的硒點擊元素時,測試透視和不可用性之間是否存在差異:driver.findElement(By.id("foobar")).click();
而不是使用座標和機器人類。用Selenium點擊並用機器人點擊之間的區別
示例:如果某個元素由於錯誤而無法點擊,機器人將無法點擊它。硒能夠點擊它嗎?
用這樣的硒點擊元素時,測試透視和不可用性之間是否存在差異:driver.findElement(By.id("foobar")).click();
而不是使用座標和機器人類。用Selenium點擊並用機器人點擊之間的區別
示例:如果某個元素由於錯誤而無法點擊,機器人將無法點擊它。硒能夠點擊它嗎?
硒儘可能地模仿普通用戶可以做什麼和不可以做什麼。當您使用findElement(...).click()
時,如果無法執行操作,硒將引發異常。例如,如果元素存在於DOM中但未顯示,則會引發異常。並注意Selenium的.click()
將嘗試滾動元素。如果您要求它點擊一個不可見的元素,但通過滾動可以看到可以看到,Selenium將滾動顯示。
另請注意,Selenium通常會採用元素的座標並在這些座標點擊一下。所以移動元素總是被findElement(...).click()
(表示在this answer中)的想法是不正確的。使用findElement
可最小化獲取座標和發送事件之間的窗口,但不會完全消除該事件。硒與座標一起工作的原因同樣是重現用戶的行爲。用戶會看到該元素,將鼠標移動到元素的座標上,然後單擊它。如果元素上有一個透明覆蓋層,則覆蓋層將獲得點擊,而不是元素。這是有效的,因爲Selenium點擊座標而不是直接發送點擊到您使用findElement
選擇的元素。
如果使用機器人進行點擊,賭注是大致相同以上,有幾個注意事項:
試圖點擊移動元素更是一個問題,因爲時間之窗在獲取座標和執行點擊之間更大。
機器人不知道DOM是如何構造的,因此不會爲您滾動元素。
Rogério Peixoto指出,您可以使用JavaScript來執行點擊。 這將導致爲元素調用click
的事件處理程序,而不管用戶是否實際上能夠訪問該元素。這可以允許點擊不可點擊的元素,但我不會這樣做,除非有最重要的原因這樣做。我已經瀏覽了Selenium的點擊和JavaScript點擊in this answer之間的區別。
總是善於學習的東西,感謝更正:) –
使用此:
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事件,你必須手動啓動它。
你是對的,我只是增加了一個例子來使它更具體。 – fx86f
如果某個元素由於錯誤而無法點擊,機器人將無法點擊它。硒能夠點擊它嗎?
這取決於什麼是阻止點擊的錯誤。我建議你幾乎在所有情況下都使用element.click()
,因爲它更易於維護。對於座標點擊,如果元素移動會怎樣?然後,您必須更新您的腳本,並使用element.click()
才能正常工作的新位置。座標點擊的另一個問題,如果你的元素移動而另一個移動到位呢?這可能會導致腳本失敗,但很難追查。一個例子可能是一個意外的彈出窗口,其中包含要點擊的元素。現在您的座標點擊會彈出並最終導致錯誤/失敗。如果你做element.click()
你至少會得到一個錯誤,其他元素會收到點擊。然後,您可以跟蹤調試過程中遇到的情況。
Selenium按我的經驗單擊單擊瀏覽器窗口內的某個元素,其中Robot當時似乎點擊桌面上的任何內容。就個人而言,我會建議你儘可能使用Selenium點擊,因爲你可以指定你點擊的窗口。
我不明白這個問題。您是否問過如果您無法使用Robot類(?)中的座標單擊按鈕,您可以使用Selenium通過元素ID來單擊它嗎? – Taegost
我試圖理解什麼是更接近(以及爲什麼)簡單的用戶點擊,機器人或硒(或Js畢竟)。 – fx86f