セレンを使用してテキストエリアからテキストをクリアする


142

特定のフィールドのテキストが無効な場合に適切なエラーメッセージが表示されることを確認するいくつかのテストがあります。有効性の1つのチェックは、特定のtextarea要素が空でないことです。

このテキストエリアにすでにテキストが含まれている場合、セレンにフィールドをクリアするように指示するにはどうすればよいですか?

何かのようなもの:

driver.get_element_by_id('foo').clear_field()

1
driver.get_element_by_id( 'foo')。clear()
Isaac

回答:


215
driver.find_element_by_id('foo').clear()

4
これは、最新のSeleniumバージョンでは機能しません。
例による統計の学習2014

3
youp chromedriverもこれで壊れます。フェニックスの回答はどこでも機能します
norbertas.gaulia

1
セレンとChromedriverのバージョンの競合に関する問題である可能性があります。開発者が意図的にchromedriverからこの機能を削除することはありそうにありません。
Isaac

7
現時点では、この回答はReactアプリでは正しく機能しません。クリアするとReact onChange関数が起動されないためです。したがって、入力はクリアされ、テストは続行され、コンポーネントの状態は以前と同じままになります。 反応の問題セレンの問題
ncrmro 2017

1
@ncrmro 3年後、これはまだ機能しないようです
スティーブン

81

使用できます

 webElement.clear();

この要素がテキスト入力要素の場合、これにより値がクリアされます。

このイベントによって発生するイベントは、予想したものとは異なる場合があることに注意してください。特に、キーボードイベントやマウスイベントは発生しません。キーボードイベントを確実に発生させたい場合は、などの使用を検討してくださいsendKeys(CharSequence)。例えば:

 webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loop

または:

 webElement.sendKeys(Keys.CONTROL + "a");
 webElement.sendKeys(Keys.DELETE);

4
CTRL + 'a'を使用する場合は、MacOS(他のキーボードショートカット)でテストを実行する状況を検討してください。ところで-良い提案、私の問題を解決しました。
Outside_Box 2018年

1
「Keys.BACK_SPACE」で問題を解決しました。検索テストフィールドをキャプチャし、.click()を実行してから、forループ内でコードを実行します。以前に検索フィールドにあったすべてのチャーターを削除します。次に、新しい値を検索フィールドに送信します。.clear()関数だけでは機能しませんでした。
Noman_ibrahim

webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loop私の奇妙なケースでのみ助けられました
Chaki_Black

17

.clear()が機能しないフィールドに遭遇しました。最初の2つの回答を組み合わせて使用​​すると、このフィールドでうまくいきました。

from selenium.webdriver.common.keys import Keys

#...your code (I was using python 3)

driver.find_element_by_id('foo').send_keys(Keys.CONTROL + "a");
driver.find_element_by_id('foo').send_keys(Keys.DELETE);

何の;ためにもう一度?
スティーブン

1
;Pythonでは@ surfer190 は必要ありません。誤って追加しました。良いキャッチ。
ジョルテガ


4

Java用

driver.findelement(By.id('foo').clear();

または

webElement.clear();

この要素がテキスト入力要素の場合、これにより値がクリアされます。


3

一般的な構文です

driver.find_element_by_id('Locator value').clear();
driver.find_element_by_name('Locator value').clear();

1

clear()の単純な呼び出しでは、対応するinput / textareaコンポーネントがまだ古い値を持っていることがDOMに表示されるため、そのコンポーネントに対する後続の変更(たとえば、コンポーネントに新しい値を入力する)は時間内に処理されません。

セレンのソースコードを見ると、clear()メソッドが次のコメントで文書化されていることがわかります。

/ **この要素がテキスト入力要素の場合、これは値をクリアします。他の要素には影響しません。テキスト入力要素は、INPUTおよびTEXTAREA要素です。このイベントによって発生するイベントは、予想したものとは異なる場合があることに注意してください。特に、キーボードイベントやマウスイベントは発生しません。キーボードイベントが確実に発生するようにするには、バックスペースキーで{@link #sendKeys(CharSequence ...)}のようなものを使用することを検討してください。変更イベントを確実に取得するには、タブキーを使用して{@link #sendKeys(CharSequence ...)}を呼び出すことを検討してください。* /

したがって、この有用なヒントを使用してinput / textarea(すでに値を持つコンポーネント)をクリアし、それに新しい値を割り当てると、次のようなコードが得られます。

public void waitAndClearFollowedByKeys(By by, CharSequence keys) {
    LOG.debug("clearing element");
    wait(by, true).clear();
    sendKeys(by, Keys.BACK_SPACE.toString() + keys);
}

public void sendKeys(By by, CharSequence keysToSend) {
    WebElement webElement = wait(by, true);
    LOG.info("sending keys '{}' to {}", escapeProperly(keysToSend), by);
    webElement.sendKeys(keysToSend);
    LOG.info("keys sent");
}

private String escapeProperly(CharSequence keysToSend) {
    String result = "" + keysToSend;
    result = result.replace(Keys.TAB, "\\t");
    result = result.replace(Keys.ENTER, "\\n");
    result = result.replace(Keys.RETURN, "\\r");

    return result;
}

このコードがPythonではなくJavaであることを申し訳ありません。また、この投稿を長くしすぎる「waitUntilPageIsReady()」メソッドをスキップする必要がありました。

これがSeleniumの旅に役立つことを願っています!


1

私の経験では、これが最も効率的であることがわかりました

driver.find_element_by_css_selector('foo').send_keys(u'\ue009' + u'\ue003')

Ctrl + Backspaceを送信して、入力からすべての文字を削除します。Backspaceをdeleteに置き換えることもできます。

編集:キーの依存関係を削除


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') FireFoxでうまく機能しました

  • u '\ ue003'は、私のような人々のBACK_SPACEです-決して覚えていない)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.