使用 Selenium 触发 Angular 页面的 ng-change
Fire ng-change of Angular page using Selenium
我有两个输入如下:
第一
<input type="text" class="form-control ng-isolate-scope ng-valid-date ng-animate ng-dirty ng-valid ng-valid-required" name="measurementDate" id=
"measurementDate" placeholder="MM/DD" datepicker-popup="MM/dd" min="01/01/2014" max="12/31/2016" datepicker-options="{"showWeeks":false,"yearRange":3}" ng-model="acawiz.data.standardPeriodStart" ng-change="acawiz.setStandardStabilityPeriodStart()" is-open="acawiz.measurementPickerIsOpen" style="">
第二
<input type="text" class="form-control ng-isolate-scope ng-pristine ng-valid-required ng-valid ng-valid-date" name="stabilityDate" id="stabilityDate" placeholder="MM/DD" show-weeks="false" datepicker-popup="MM/dd" min="01/01/2014" max="12/31/2016" datepicker-options="{"showWeeks":false,"yearRange":3}" ng-model="acawiz.data.standardStabilityPeriodStart" ng-change="acawiz.standardStabilityPeriodStartChanged()" is-open="acawiz.stabilityPickerIsOpen" ng-required="true" readonly="" required="required">
这些日期是使用日期选择器(作为最终用户)填充的。但是,对于 Selenium
测试,我决定绕过日期选择器,因为这会使测试更加不稳定。为了解决这个问题,我最初想删除 required
和 readonly
属性并使用 sendKeys()
输入日期,我成功了。我还尝试设置它们的值 属性,我看到发生了以下变化:
string value = Convert.ToDateTime(date).ToString("MM/dd");
string setValueProp = @"document.getElementById('measurementDate').value = '" + value + "'";
ExecuteJavaScript(setValueProp);
但是,当我单击完成向导时,我没有看到我在日期中所做的更改,可能的原因是 ng-change="acawiz.standardStabilityPeriodStartChanged()"
甚至从未触发过。有没有一种方法可以使用上面的 javascript 代码相应地触发 ng-change?
当您以编程方式更改模型(就像您正在做的那样)时,不会触发 ng-change
事件。我认为您将不得不手动调用更改事件。
string value = Convert.ToDateTime(date).ToString("MM/dd");
string setValueProp = @"$('#measurementDate').val('" + value + "').trigger('change');";
ExecuteJavaScript(setValueProp);
我有两个输入如下:
第一
<input type="text" class="form-control ng-isolate-scope ng-valid-date ng-animate ng-dirty ng-valid ng-valid-required" name="measurementDate" id=
"measurementDate" placeholder="MM/DD" datepicker-popup="MM/dd" min="01/01/2014" max="12/31/2016" datepicker-options="{"showWeeks":false,"yearRange":3}" ng-model="acawiz.data.standardPeriodStart" ng-change="acawiz.setStandardStabilityPeriodStart()" is-open="acawiz.measurementPickerIsOpen" style="">
第二
<input type="text" class="form-control ng-isolate-scope ng-pristine ng-valid-required ng-valid ng-valid-date" name="stabilityDate" id="stabilityDate" placeholder="MM/DD" show-weeks="false" datepicker-popup="MM/dd" min="01/01/2014" max="12/31/2016" datepicker-options="{"showWeeks":false,"yearRange":3}" ng-model="acawiz.data.standardStabilityPeriodStart" ng-change="acawiz.standardStabilityPeriodStartChanged()" is-open="acawiz.stabilityPickerIsOpen" ng-required="true" readonly="" required="required">
这些日期是使用日期选择器(作为最终用户)填充的。但是,对于 Selenium
测试,我决定绕过日期选择器,因为这会使测试更加不稳定。为了解决这个问题,我最初想删除 required
和 readonly
属性并使用 sendKeys()
输入日期,我成功了。我还尝试设置它们的值 属性,我看到发生了以下变化:
string value = Convert.ToDateTime(date).ToString("MM/dd");
string setValueProp = @"document.getElementById('measurementDate').value = '" + value + "'";
ExecuteJavaScript(setValueProp);
但是,当我单击完成向导时,我没有看到我在日期中所做的更改,可能的原因是 ng-change="acawiz.standardStabilityPeriodStartChanged()"
甚至从未触发过。有没有一种方法可以使用上面的 javascript 代码相应地触发 ng-change?
当您以编程方式更改模型(就像您正在做的那样)时,不会触发 ng-change
事件。我认为您将不得不手动调用更改事件。
string value = Convert.ToDateTime(date).ToString("MM/dd");
string setValueProp = @"$('#measurementDate').val('" + value + "').trigger('change');";
ExecuteJavaScript(setValueProp);