web-dev-qa-db-ja.com

Appium:フィールドをクリアします

アプリにログイン画面を表示しています。アプリが画面で起動されるたびに、携帯電話番号には古いテキストが事前に入力されます。

私が試したことを知りたいだけです:

WebElement mob = driver.findElement(By.name("Mobile Number"));
mob.clear // Not working

私が試してみました :

String Mobile
mob="";   

ただし、事前に入力されたテキストは削除できません。

Android appiumを使用してappiumを自動化しようとしています。これを手伝ってください。

12
user1664899

それは間違いなく効率的ではなく、改善される可能性があり、おそらくもっと良い方法があります...しかし、adbのシェル入力キーイベントコードを使用して、カーソルを右端まで移動するために単に「dpad right」と呼びました。そこに到達したら、キーコード「DEL」を送信して、完全に削除を開始します...それで... 2つのforループ。これは主に短いテキストに使用されていました:

public void cleatTextFully(WebElement element) {
    int stringLength = element.getText().length();

    for (int i = 0; i < stringLength; i++) {
        mDriver.sendKeyEvent(22); // "KEYCODE_DPAD_RIGHT"
    }

    for (int i = 0; i < stringLength; i++) {
        mDriver.sendKeyEvent(67); // "KEYCODE_DEL"
    }
}

mDriverはAppiumDriverインスタンスです。これが何かに役立つことを願っています。

6
Alon Minski

私もこれで苦労しました。私が見つけた主な問題は、削除キーを押して領域を削除するには、行の最後をタップする必要があることでした。これは私にとってはうまくいきます:

public void clearTextField(WebElement element) {
    double x = element.getLocation().getX() + element.getSize().width - 5;
    double y = element.getLocation().getY() + ((double) element.getSize().height / 3);
    preciseTap(x, y, 0.1, 1);
    while (!element.getText().isEmpty()) {
        pressDeleteKey();
    }
}

public void preciseTap(double x, double y, double duration, int touchCount) {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    HashMap<String, Double> tapObject = new HashMap<String, Double>();
    tapObject.put("x", x);
    tapObject.put("y", y);
    tapObject.put("touchCount", (double)touchCount);
    tapObject.put("duration", duration);
    js.executeScript("mobile: tap", tapObject);
}

public void pressDeleteKey() {
    HashMap swipeObject = new HashMap();
    swipeObject.put("keycode", 67);
    ((JavascriptExecutor) driver).executeScript("mobile: keyevent", swipeObject);
}

すべてをクリアするよりもかなり遅いですが、これを行う方法はまだわかりません。ダブルタップするか、すべてが選択されるまでタップしてホールドするのが理想的でしょう。

5
plosco

クリアする前にtextBoxをクリックすると、最新のライブラリで実行できます。

WebElement mob = driver.findElement(By.name("Mobile Number"));
mob.click();
mob.clear();

またはサンプルjUnitTestから ここ

WebElement text = driver.findElement(By.xpath("//UIATextField[1]"));
text.sendKeys("12");
text.clear();

私は推測する

5
Naman

「textField()。clear()」が一部のデバイスやGenymotionなどのエミュレーターで動作しないように見えるため、以下のコードを使用してこの問題を解決できました。

while (!textField().getText().isEmpty()) {
   TouchAction touchAction = new TouchAction(driver);
   touchAction.longPress(textField());
   driver.getKeyboard().sendKeys(Keys.DELETE);
}

コードはテキストフィールドがクリアされるまでループします。これが役に立てば幸い、AndroidとiOSの両方で機能します。

3
Yomi Folami

Androidでテストが実行されている場合は、selectAllを使用できます。

  • テキストフィールドのlongPress
  • SelectAllの要素を見つけてタップします(Androidのすべて選択ボタン)
  • sendKeyEvent(67)

テキスト全体を選択し、Deleteキーを押します。

3
Kevin Shah

appiumの組み込みのclearメソッドの使用を控えたい場合があります。

androidに削除キーイベントを送信するadb Shell input keyevent 67を使用してみてください。これはすべてのバージョンでほぼ機能します。

テキストフィールドを2回クリックするだけで、テキストを強調表示できます。

WebElement mob = driver.findElement(By.tagName( "editText"));

これにより、最初のtextField avilableが見つかります。Seleniumバインディングの他のメソッドと同様に、findElementsを試し、配列内のすべてのテキストフィールドを取得して、操作するものを選択できます。

次に、入力キーイベント67を送信してフィールド全体を削除します。

2
Dnile

同じ問題に直面しましたが、適切な解決策が1つ見つかりました。

 public void clearTextBox(WebElement element) throws Exception
  {
      element.click();
      element.sendKeys(Keys.CONTROL + "a");
      element.sendKeys(Keys.DELETE);          
  }

それは確かに動作します。

1

私は最近同様の問題に直面しました。私がしたこと、_equals ""_の場合は編集テキストからテキストを取得し、次にclear()メソッドと呼ばれるキーを送信します。

1
Shekhar Swami

最近のiOS 8.xエラーを回避するために、私は以下を使用します(byは、テキストフィールド/テキストビューを表すByのインスタンスです):

    int stringLength = driver.findElement(by).getText().length();
    if (stringLength > 0) {
        driver.findElement(by).clear();
    }

すでにクリアされているテキストフィールドに対してclear()を呼び出そうとすると、私はappiumでエラーが発生する傾向がありました。

1

テキストフィールドにあらかじめ指定された携帯電話番号が含まれている場合は、次のようにしてください。

WebElement mob = driver.findElement(By.name( "xxxxxxxxxx")); mob.clear();

xxxxxxxxxx:アプリケーションを開くときに事前に指定された携帯電話番号。

それ以外の場合は、By.xpathやBy.id(Androidおよび機能としてSelendroidをテストしている場合)などのような、他の検索手法を使用します。

1
Abhishek Swain

この方法はうまくいきましたが、より良い解決策を模索しています。その間、この方法を使用してください。

public void clear(String locatorType, String locator, long... waitSeconds)
{

WebElement we =  getElementWhenPresent(getByLocator(locatorType, locator), waitSeconds);

String text = we.getText();

int maxChars = text.length();

//we.clear() is not working

for (int i = 0; i < maxChars; i++)

((AppiumDriver)driver).sendKeyEvent(67);

}
1
abhii2628
def Clear(self):
    self.driver.keyevent(123)#Move Cursor Last one
    time.sleep(2)
    for i in range(10):
        self.driver.keyevent(67)#Deleted Keyboard 
        self.driver.implicitly_wait(60)
0
ILA chaos

この問題は、最新バージョンのappiumを使用することで解決できます。古いバージョンでは、長いテキストの場合、clearがすべてのテキストフィールドをクリアしないことがあります。

0
mashkurm

これはログイン画面に関するものなので、スクリプトを実行するたびにアプリを再起動し、アピアムに移動してAndroid設定でフルリセットを確認してください。

0
Emna

私はcucumberRubyを使用してテストを記述していますが、これはiOSとAndroidの両方に適しています)。

arg1およびarg2は、gherkinステップで指定する入力値です。

And(/^I enter "([^"]*)" on identifier "([^"]*)"$/) do |arg1, arg2|
      Input = find_element(id: arg2)
      Input.click
      Input.clear
      Input.send_keys(arg1)
    end
0
Emjey

私は同じ問題に直面しました。

キーをクリックして、クリアして送信しようとしたところ、うまくいきました。

このコードを参照

driver.findElement(By.name("address").click(); 
driver.findElement(By.name("address").clear();
driver.findElement(By.name("address").sendKeys("something");`
0
pinktoes

IOSアプリを自動化しているときに特定のフィールドをクリアできなかったため、この問題を解決するのに苦労しました

他の代替手段も使用できなかったので、これは私の場合うまくいきました!

1.キーボードの削除ボタンのXPathを取得してループし、クリックメソッドを使用してそれをクリアしますこれは私の場合に機能したものです

for(int x=1;x<6;x++)
{
    driver.findElementByXpath("//XCUIElementTypeKey[@name='Delete']").click;
}
0
ANMOL
driver.findElement(By.name("Mobile Number")).clear();

これは私にとってはうまくいきます。 idでfind要素を使用してから、clearを呼び出しています。

wd.findElement(By.id("username")).clear();

これにより、私の場合、ユーザー名フィールドに事前に入力されたデータが消去されます。

0
Suman

私はpythonを使用していますが、これは私が使用するものです:

 self.driver.find_element_by_id(element_id).click()
 self.driver.find_element_by_id(element_id).send_keys('')

お役に立てば幸いです。

0
AndreiP

これは通常、アプリで開いている画面が「WebView」の場合に発生します。

同様の問題に直面したとき、私は以下の手順に従いました:

  1. 「getAttribute」メソッドを使用して、テキストフィールドの値、つまり事前入力されたテキストを取得します。次に、削除する文字がいくつあるかを知るために、文字列の長さを取得します
  2. テキストフィールドをタップします。
  3. iOSキーボードの「削除ボタン」要素を使用してテキストフィールド内の文字を削除しました。
  4. テキストフィールドに必要な値を入力しました。

以下は、問題の解決に役立つコードです。

 WebElement ele = driver.findElement(By.xpath( "// Locator of the textfield")); //テキストフィールドを見つける
 
 int characters_to_delete = ele.getAttribute( "value")。length(); //削除する文字数をカウントする
 
 ele.click(); //テキストフィールドをタップまたはクリック
 
 //事前入力された値からテキストフィールドを削除またはクリア
 for(int i = 0; i <characters_to_delete; i ++){
 driver.findElement(By.xpath( "// Locator of the Keyboard button 'Delete'"))。click(); 
} 
 
 ele.sendKeys (「テキストフィールドに入力する値」); //テキストフィールドに値を入力します
0
Subh
    WebElement element2 = appiumDriver.findElement(By.xpath(element));
        element2.sendKeys(Keys.CONTROL + "a");
         element2.sendKeys(Keys.DELETE);
0
akhilesh gulati

私のために働いています:

action.longPress(WebElement).perform();
WebElement.clear();
0
Adama Diagne
List<WebElement> x=driver.findElements(By.className("enter widget details")); //You can get widget details via Android UIautomator
driver.findElementById("enter widget details").click(); //You can get widget details via Android UIautomator
x.get(index).clear();
x.get(index).clear();

これは私にとってはうまくいきましたが、あなたの要件に従ってコードを操作する必要があるかもしれませんので、ありがとうございます。

0
Star

IOSの場合、以下のスニペットのコードを使用して、バックスペース/削除を実行できます。

    //Get the keyword
    String name = driver.findElement(by).getText();
    WebElement e1 = driver.findElement(by);
    System.out.println("Length of Keyword = " +name.length());
    int count = 0;
    int keywordlength = name.length();
    //click on keyword textbox
    e1.click();
    while (count < keywordlength) {
        //Clear the keyword
           TouchAction ta = new TouchAction(driver);
           ta.longPress(e1);
           driver.getKeyboard().sendKeys(Keys.DELETE);
           count++;
    }
0
Shabana Parveen

私にとって助けとなったのは、クリアの前に空のsendKeysを追加することでした。

このような:

public void sendKeysToElement(WebElement element, String keys) {
    element.sendKeys("");
    element.clear();
    element.sendKeys(keys);
    driver.hideKeyboard();
}

このメソッドは、すべての入力フィールドに使用されます。空のsendKeysがないと、すべてのフィールドが適切にクリアされませんでした。

0
HWentzke

ダブルタブを使用していて、空のキーをフィールドに送信しています。これは、UIテストで安定して動作します。

new TouchAction<>((AndroidDriver<?>) driver).tap(new TapOptions().withTapsCount(2).withElement(new ElementOption().withElement(element))).perform();
element.sendKeys("");
0
AndiCover