12

Selenium WebDriverを使用して、デフォルトのテキスト「EnterUserID」を持つGWT入力要素にテキストを入力しようとしています。これを機能させるために私が試みたいくつかの方法は次のとおりです。

        searchField.click();
        if(!searchField.getAttribute("value").isEmpty()) {
            // clear field, if not already empty 
            searchField.clear();
        }
        if(!searchField.getAttribute("value").isEmpty()) {
            // if it still didn't clear, click away and click back
            externalLinksHeader.click();
            searchField.click();
        }

        searchField.sendKeys(username);

奇妙なことに、これは上記の場合にのみ機能します。場合によっては、「Enter User IDus」を検索し、基本的にデフォルトのテキストの後に「username」と入力し始め、それを終了することさえありません。

GWT要素からデフォルトのテキストをクリアする他のより良い、より信頼できる方法はありますか?

追加するために編集:入力要素のHTML。残念ながら、JS / GWTの熱さのおかげで、見るものはあまりありません。選択されていない場合のフィールドは次のとおりです。

<input type="text" class="gwt-TextBox empty" maxlength="40">

クリックして手動でフォーカスを与えると、デフォルトのテキストと「空の」クラスが削除されます。

JSは、変更によって空のテキストフィールドが生成された場合のsetDefaultText()両方onBlur()で呼び出されます。onChange()それが役に立たない理由だと思いsearchField.clear()ます。

また、デバッグモードでこの方法を実行しましたが、その場合は機能しません。通常どおりに実行すると、ほとんどの場合機能します。でも、理由は言えません。

4

4 に答える 4

22

さて、clear()メソッドがをクリアしinputて空のままにすると、スクリプトが明らかに開始されます。それが思いついた解決策を以下に示します。

  1. ナイーブなものは、Backspace10回押します:

    String b = Keys.BACK_SPACE.toString();
    searchField.sendKeys(b+b+b+b+b+b+b+b+b+b + username);
    

    StringUtils.repeat()Apache CommonsLangまたはGoogleGuavaからStrings.repeat())が役立つ場合があります)

  2. Ctrl+ADelete、:を使用したより良いもの

    String del = Keys.chord(Keys.CONTROL, "a") + Keys.DELETE; 
    searchField.sendKeys(del + username);
    
  3. inputJavaScript経由でコンテンツを削除する:

    JavascriptExecutor js = (JavascriptExecutor)driver;
    js.executeScript("arguments[0].value = '';", searchField);
    searchField.sendKeys(username);
    
  4. inputJavaScriptを介しての値を完全に設定します。

    JavascriptExecutor js = (JavascriptExecutor)driver;
    js.executeScript("arguments[0].value = '" + username + "';", searchField);
    

ここに示すように、javascriptが常に機能するとは限らないことに注意してください。javascriptで入力フィールドをクリアできないのはなぜですか。

于 2012-07-01T07:43:33.560 に答える
0

それが価値があることについて、私は非常によく似た問題を抱えています。WebDriver2.28.0およびFireFox18.0.1

私もGWTを使用していますが、単純なHTML/JSで再現できます。

<html>
<body>
<div>
<h3>Box one</h3>
<input id="boxOne" type="text" onfocus="if (this.value == 'foo') this.value = '';" onblur="if (this.value == '') this.value = 'foo';"/>
</div>
<div>
<h3>Box two</h3>
<input id="boxTwo" type="text" />
</div>
</body>
</html>

このテストはほとんどの場合失敗します。

@Test
public void testTextFocusBlurDirect() throws Exception {
  FirefoxDriver driver = new FirefoxDriver();

  driver.navigate().to(getClass().getResource("/TestTextFocusBlur.html"));

  for (int i = 0; i < 200; i++) {
      String magic = "test" + System.currentTimeMillis();
      driver.findElementById("boxOne").clear();
      Thread.sleep(100);
      driver.findElementById("boxOne").sendKeys(magic);
      Thread.sleep(100);
      driver.findElementById("boxTwo").clear();
      Thread.sleep(100);
      driver.findElementById("boxTwo").sendKeys("" + i);
      Thread.sleep(100);
      assertEquals(magic, driver.findElementById("boxOne").getAttribute("value"));
  }

  driver.quit();
}

WebDriverが制御できない方法で、OSがブラウザからフォーカスを奪っているだけかもしれません。CIサーバーでこの問題が発生することはないようです。

于 2013-02-05T13:41:53.037 に答える
0

まだコメントを追加できないので、ここに回答として載せています。入力テキストフィールドをクリアおよび/または編集するためにjavascriptのみを使用する場合、@slanecによって提供されるjavascriptアプローチは機能しないことをお知らせします。次に例を示します。javascriptで入力フィールドをクリアできないのはなぜですか?

于 2016-08-15T01:16:38.970 に答える
0
In case you use c# then solution would be :

// provide some text
webElement.SendKeys("aa");
// this is how you use this in C# , VS
String b = Keys.Backspace.ToString();

// then provide back space few times 
webElement.SendKeys(b + b + b + b + b + b + b + b + b + b);
于 2017-12-05T18:19:43.513 に答える