私は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]");
}
あなたがより良い方法を知っているなら、助けてください! :)
これはこのAngular2の問題が原因であると思います https://github.com/angular/angular/issues/5808
Angularは到着が速すぎると入力イベントを処理できません。
回避策として、1つの文字を少しずつ遅延させて送信する必要があります。
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
Java、Seleniumでもこのエラーが発生しました。コードの作成中にもこのエラーが発生する可能性があります-"sendKeys(CharSequence)from the type Webelement refering the missing type charSequence"
待機時間を変えたり、メインキャラクターの前に余分な文字を入力したりしても、うまくいきませんでした。
私が使用した簡単なトリックは、JavaコンパイラのバージョンをJRE 9からJRE 10に変更することでした。
使用する
動作も発生し、さらに悪化します。文字が入力された後、突然消えます。回避策は、永続的で、もう一度試してください。そしてまた。最終的に文字が入力されるまで。
// 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));
}
}
同じ問題がありました。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);
}