Selenium click 不适用于 angularjs ng-click 事件

Posted

技术标签:

【中文标题】Selenium click 不适用于 angularjs ng-click 事件【英文标题】:Selenium click doesn't work with angularjs ng-click event 【发布时间】:2016-04-16 05:01:19 【问题描述】:

我希望验证是否在 ng-click 事件上调用了特定的外部函数。输入声明如下。这在浏览器中运行良好,因此在功能上没有问题,只有在使用 Selenium 进行测试时,我没有看到正确的结果。 myFunction 正在调用外部 myExternalFunction,这是我要验证的行为。我们已经有 jasmine 测试,间谍在不同的环境中验证了这种行为,但无论如何都需要 Selenium。此外,我们目前不使用量角器。我正在寻找 Selenium 的解决方案。

<input class="myClass" ng-click="myFunction()">

在 C# Selenium 测试中,我正在编写:

// Creating the mock external function since the context doesn't have it.
IjavascriptExecutor executor = WebDriver as IJavaScriptExecutor;
executor.ExecuteScript("window.called='false'");
executor.ExecuteScript("window.external = ");

// The behavior will be just setting the called variable to true.
// We will retrieve the variable and check the value to see if the function was called.
executor.ExecuteScript("window.external.myExternalFunction = function() window.called = 'true';");

// Select the element - there's only one element with this classname
IWebElement element = WebDriver.FindElement(By.ClassName("myClass"));
string value = "";  
// Verified via debugging that the element is actually valid.
// Tried the following options.

// 1) Just click and wait for event propagation - didn't work.
element.Click(); // Didn't do anything so added a Thread Sleep to make sure.
Thread.Sleep(1000);
value = WebDriver.ExecuteJavaScript<string>("return window.called;"); // returns false - expected to be true.

// 2) Use the actions to focus and click.
IWebDriver driver = WebDriver;
Actions a = new Actions(driver);    
a.MoveToElement(element).Perform();
a.MoveToElement(element).Click().Perform();
Thread.Sleep(1000);
value = WebDriver.ExecuteJavaScript<string>("return window.called;"); // returns false - expected to be true.

// 3) Select and click via javascript instead.
executor.ExecuteScript("angular.element('.myClass').click();");
Thread.Sleep(1000);
value = WebDriver.ExecuteJavaScript<string>("return window.called;"); // returns false - expected to be true.

在这个阶段我几乎没有想法。有没有办法让 Selenium 与 angularjs 配合得很好?类似的问题在这里:Selenium click event does not trigger angularjs ng-click 没有结论性的答案。

【问题讨论】:

【参考方案1】:

我建议,使用 xpath 来定位元素,你应该很好。如果可能,请分享 xpath。

【讨论】:

我会试试这个并回复你,但是我已经验证我能够选择正确的元素。该 css 类只有一个现有元素,在调试时我看到了有关该元素的正确详细信息 - 因此问题似乎更可能与实际事件传播有关。 这似乎解决了我使用 Firefox 47 的问题。使用 Css 选择器确实填写了该字段,但没有触发 javascript。【参考方案2】:

您可以使用 css 选择器,它应该可以工作:

By.cssSelector("input[ng-click='myFunction()']") 

【讨论】:

我会试试这个并回复你,但是我已经验证我能够选择正确的元素。该 css 类只有一个现有元素,在调试时我看到了有关该元素的正确详细信息 - 因此问题似乎更可能与实际事件传播有关。

以上是关于Selenium click 不适用于 angularjs ng-click 事件的主要内容,如果未能解决你的问题,请参考以下文章

scrollIntoView() 不适用于水平滚动(Selenium)

Firefox Build 不适用于 Selenium

Selenium C#FirefoxDriver不适用于最新的Selenium和Firefox

Selenium 2.53 不适用于 Firefox 28

Selenium 2.53 不适用于 Firefox 47

单击不适用于 Selenium 的元素