我与Selenium合作了大约4年。这是第一次发生在我身上,我找不到将文本发送到输入字段的正确方法。 我们的应用程序使用角度2,我相信它与它有关。 我们需要使用angular 2指令的字段来检查它是否是一个数字,然后将其格式化(只是添加逗号)。 当我使用常规的selenium sendKeys()方法时,文本不会出现在输入字段中,没有异常。 我试过使用Jquery:
$("#test_borrowValue").val(770)
来自selenium和谷歌Chrome控制台的。 文本出现在输入内部,但角度没有看到它,因为它是必填字段,所以无法继续进行测试。
我尝试过各种各样的selenium和js:
action.keyDown(Keys.CONTROL).sendKeys("770").keyUp(Keys.CONTROL).perform();
$("#test_borrowValue").val(45).trigger("keydown", {which: 103});
唯一可行的是java Robot框架或Windows api。但当然它并不能可靠地运作。 由于在测试期间没有其他任何东西可以打开,窗户必须在顶部。 任何人在错误的时刻点击屏幕上的任何地方都可能会破坏测试。在詹金斯,它总是失败。
以下是html输入的外观:
`<input id="test_borrowValue" inputNumber class="form-control require-input" formControlName="borrowValue"
[ngClass]="{requireInputError : !form.controls.borrowValue.valid && form.controls.borrowValue.touched}"/>`
这里有角度2指令:
import { Directive, ElementRef, HostListener ,OnInit} from '@angular/core';
@Directive({
selector: '[inputNumber]'
})
export class InputNumberDtv implements OnInit {
private el:HTMLElement;
constructor(el:ElementRef) {
this.el = el.nativeElement;
}
ngOnInit():any {
this.onBlur();
}
@HostListener('keydown', ['$event']) onKeyDown(event:KeyboardEvent) {
var isNumberRegex = /^\d$/;
if (!isNumberRegex.test(event.key) && !this.permittedKeyCodes(event)) {
event.preventDefault();
}
}
@HostListener('focus') onFocus() {
$(this.el).val($(this.el).val().replace(/,/g, ""));
}
@HostListener('blur') onBlur() {
$(this.el).val($(this.el).val().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
}
private permittedKeyCodes(event:KeyboardEvent) {
return event.keyCode === 46 /* Delete */
|| event.keyCode === 8 /* Backspace */
|| event.keyCode === 37 /* Arrow Left */
|| event.keyCode === 38 /* Arrow Up */
|| event.keyCode === 39 /* Arrow Right */
|| event.keyCode === 40 /* Arrow Down */
|| event.keyCode === 9 /* Tab */
|| event.keyCode === 18; /* Alt */
}
}
如果我评论@HostListener块,sendKeys()方法开始按预期工作。但当然我们需要验证和格式化。
寻找来自selenium,js(测试方)和角度2(开发方)解决方案的建议。
答案 0 :(得分:1)
问题可能出在这段代码中:
var isNumberRegex = /^\d$/;
if (!isNumberRegex.test(event.key)...
检查event.key
是否具有适当的值。
经过一些研究后,似乎因为selenium web驱动程序不再使用本机事件,event.key属性将为空。
所以唯一的解决方案是接收事件的关键属性,如下所示:
String.fromCharCode(event.keyCode);
这就是开发人员必须这样做的方式。它与Angular 2无关。查看此链接:
https://github.com/seleniumhq/selenium/issues/386
注意:它不仅适用于Firefox浏览器。
答案 1 :(得分:0)
如果它是角度应用,那么使用量角器代替硒框架是好的,因为量角器是好的,如果角度应用。