无法使用角度2指令将带有selenium的文本输入到字段中

时间:2017-02-05 16:22:18

标签: javascript java selenium angular automated-tests

我与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(开发方)解决方案的建议。

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)

如果它是角度应用,那么使用量角器代替硒框架是好的,因为量角器是好的,如果角度应用。