web-dev-qa-db-ja.com

Selenium sendKeysがすべての文字を送信しない

私はJava、Selenium、およびChromeを使用しています。開発者は最近、UIをAngularJSからAngular2にアップグレードしました(問題かどうかは不明です)。しかし、それ以来、sendKeysは不完全な文字を入力していますテキストフィールドに入力します。例は次のとおりです。

    public void enterCustomerDetails()
    {   
        txtFirstName.sendKeys("Joh201605130947AM");
        txtSurname.sendKeys("Doe201605130947AM");
        txtEmail.sendKeys("[email protected]");
    }

ExecuteScriptも使用してみました。うまくいきませんでした。完全な文字を入力できますが、フォームはフィールドがnullと見なします。

public void forceSendKeys(WebElement element, String text)
{
    if (element != null)
        ((JavascriptExecutor) this.webDriver).executeScript("arguments[0].value=arguments[1]", element, text);
}

public void enterCustomerDetails()
        {   
            forceSendKeys(txtFirstName, "Joh201605130947AM");
            forceSendKeys(txtSurname, "Doe201605130947AM");
            forceSendKeys(txtEmail, "[email protected]");
        }

また、.sendKeysの前に.click()を使用して、スリープ時間を追加してみました。彼らも働かなかった。

私はこの投稿から文字を1つずつ入力するアイデアを得ました: Selenium Webdriverのテキストフィールドに文字を1つずつ入力する方法?

機能しましたが、すべてのコードをsendKeysから新しい関数に書き換える必要があります。

    public void sendChar(WebElement element, String value)
{
    element.clear();

    for (int i = 0; i < value.length(); i++){
        char c = value.charAt(i);
        String s = new StringBuilder().append(c).toString();
        element.sendKeys(s);
    }       
}

public void enterCustomerDetails()
    {
        sendChar(txtFirstName, "Joh201605130947AM");
        sendChar(txtSurname, "Doe201605130947AM");      
        sendChar(txtEmail, "[email protected]");
    }

あなたがより良い方法を知っているなら、助けてください! :)

14
Larica B

これはこのAngular2の問題が原因であると思います https://github.com/angular/angular/issues/5808

Angularは到着が速すぎると入力イベントを処理できません。

回避策として、1つの文字を少しずつ遅延させて送信する必要があります。

2

NightwatchJS(Seleniumを使用)との統合テストを行っているときに、このエラーに遭遇しました。

なので、これから来る人のために書いています。

私はこれ拡張コマンドを夜警のために書きました:

exports.command = function (selector, value, using) {
    var self = this;
    self.elements(using || 'css selector', selector, function (elems) {
        elems.value.forEach(function (element) {
            for (var c of value.split('')) {
                self.elementIdValue(element.ELEMENT, c);
            }
        });
    });
    return this;
};

これはこのように使用できます:

var username = '[email protected]';
browser.setValueSlow('input[ngcontrol=username]', username); //Works with ng2!

この問題はNightwatchJSのgithubでも議論されました here

1
Arg0n

Java、Seleniumでもこのエラーが発生しました。コードの作成中にもこのエラーが発生する可能性があります-"sendKeys(CharSequence)from the type Webelement refering the missing type charSequence"

待機時間を変えたり、メインキャラクターの前に余分な文字を入力したりしても、うまくいきませんでした。

私が使用した簡単なトリックは、JavaコンパイラのバージョンをJRE 9からJRE 10に変更することでした。

0
Seunara

使用する

  • クロム78.0.3904.70、
  • Vaadin Flow Framework 14.1.3、
  • セレン3.141.59
  • およびOpenJDK 11.0.5

動作も発生し、さらに悪化します。文字が入力された後、突然消えます。回避策は、永続的で、もう一度試してください。そしてまた。最終的に文字が入力されるまで。

    // Type in every single character
    for (int i = 0; i < textToType.length(); i++) {
        boolean typingCharacterWasSuccessful = false;
        // If typing was not successful before, just type again
        while (!typingCharacterWasSuccessful) {
            // Type in the character
            char singleCharacterToType = textToType.charAt(i);
            htmlTextfeld.sendKeys(Character.toString(singleCharacterToType));
            // Wait a little. Maybe alternatively/additionally wait.until(...)
            Thread.sleep(200);
            // Check typed in string.
            String inputValueAfterTyping = htmlTextfeld.getAttribute("value");
            if (inputValueAfterTyping.length() > i + 1) {
                // Alternatively: delete everything and start all over
                throw new Exception("Input value too long. Maybe character typed in twice!?");
            }
            // Typing was successful if the value in the input field is as expected (up to now)
            typingCharacterWasSuccessful
                    = inputValueAfterTyping.equals(textToType.substring(0, i + 1));
        }
    }
0
S. Doe

同じ問題がありました。Seleniumが文字を変更しているのを注意深く見た場合、一部の数字はバックスペースまたは他の記号を実行します。vncserverでSeleniumを使用すると発生することを読んで、firefoxに変更しました。

それがあなたの問題ではない場合、おそらくデータを分割して送信します:

input1="Joh201605130947AM"
txtFirstName.sendKeys(input1[0:7])
txtFirstName.sendKeys(input1[8:end])

これは、Angularアプリのバグが原因です。回避策は、スリープ関数を配置することです。

public void setText(By element, String text) {
    sleep(100); // Angular version < 2 apps require this sleep due to a bug
    driver.findElement(element).clear();
    driver.findElement(element).sendKeys(text);
}
0
batuarslan