簡體   English   中英

Selenium 點擊事件不會觸發 angularjs 事件

[英]Selenium click event does not trigger angularjs event

我有這個頁面,其中有一個 angularjs 模態內容彈出窗口,在那里我填寫了一些字段並單擊保存。 啟動保存后,彈出窗口應該會消失一個應該發生的事件等等。

我的 selenium 測試完美地完成了所有這些,除了當它點擊保存按鈕時,彈出窗口消失但沒有觸發或保存任何事件,所以當我再次打開窗口時,一切都是空的。 我用硒嘗試了我知道的東西,但它仍然不起作用。 有誰可以幫我離開這里嗎?

這是保存按鈕:

<button class="save-button" data-ng-click="onSettingsSave()" ng-hide="readOnlyMode || !canSave()">Save</button>

我試過的東西:

var saveButton = driver.FindElement(By.CssSelector("button.save-button"));
saveButton.Click();

var saveButton = driver.FindElement(By.XPath(saveXpath));
saveButton.SendKeys(Keys.Enter);

((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].focus();",saveButton);
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();",saveButton );

嘗試使用純 JS 強制單擊元素:

driver.execute_script("arguments[0].click();", yourElement)

就像 OP 一樣,我已經嘗試了所有我能想到的讓 Selenium 觸發客戶端 JavaScript 事件的方法。 我在網上看到一些帖子,有些人在隨機工作的情況下取得了部分成功; 就我而言,它永遠不會起作用。

Selenium 確實成功地觸發了瀏覽器的主要點擊操作,無論是選中復選框還是按下按鈕,但它不會觸發任何附加的客戶端 JavaScript 事件。

selenium 中的本機 element.Click() 方法和@csaladenes 建議的帶有單擊參數方法的抽象 ExecuteScript 具有相同的結果。

到目前為止,我發現的唯一解決方案是通過相同的 ExecuteScript 方法使用純 JS; 基本上避免了參數 selenium 可以嵌入的過載。

driver.ExecuteScript("$('#base_element_id div input').click()");

在我的例子中,我使用頁面上已經存在的 JQuery 來更輕松地定位元素,但是任何形式的真正純 JS 都應該做同樣的事情。

編輯:經過一些額外的測試,事實證明我的“修復”真的什么也沒做。 但是,多次執行相同的單擊確實會觸發客戶端事件。

在我的情況下,我正在檢查一個復選框,因此我需要執行 3 次單擊以使其處於正確狀態並仍然運行客戶端事件。

這很奇怪,而且肯定需要做更多的工作來弄清楚問題出在哪里,這使得這變得很有必要。

編輯2:我想我終於找到了一個解決方案,至少是部分答案,這不會讓我畏縮。

Selenium 似乎有一個問題,有時它會 “失去”瀏覽器的焦點 考慮到我的問題的一致性和可重復性,我認為焦點不是我的唯一問題,但是解決方案效果很好。

我能夠獲得我的復選框的直接父級,它是一個 div 元素,首先單擊它以將焦點返回到頁面,然后單擊復選框。 在這一系列事件之后,客戶端事件正常工作。

您不能在這樣的腳本中使用 $ 作為 document.querySelector 的快捷方式。

driver.ExecuteScript("document.querySelector('#base_element_id div input').click()");

這也可能不會在反應/角度觸發 onClick

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM