アプリにログイン画面を表示しています。アプリが画面で起動されるたびに、携帯電話番号には古いテキストが事前に入力されます。
私が試したことを知りたいだけです:
WebElement mob = driver.findElement(By.name("Mobile Number"));
mob.clear // Not working
私が試してみました :
String Mobile
mob="";
ただし、事前に入力されたテキストは削除できません。
Android appiumを使用してappiumを自動化しようとしています。これを手伝ってください。
それは間違いなく効率的ではなく、改善される可能性があり、おそらくもっと良い方法があります...しかし、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インスタンスです。これが何かに役立つことを願っています。
私もこれで苦労しました。私が見つけた主な問題は、削除キーを押して領域を削除するには、行の最後をタップする必要があることでした。これは私にとってはうまくいきます:
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);
}
すべてをクリアするよりもかなり遅いですが、これを行う方法はまだわかりません。ダブルタップするか、すべてが選択されるまでタップしてホールドするのが理想的でしょう。
クリアする前に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();
私は推測する
「textField()。clear()」が一部のデバイスやGenymotionなどのエミュレーターで動作しないように見えるため、以下のコードを使用してこの問題を解決できました。
while (!textField().getText().isEmpty()) {
TouchAction touchAction = new TouchAction(driver);
touchAction.longPress(textField());
driver.getKeyboard().sendKeys(Keys.DELETE);
}
コードはテキストフィールドがクリアされるまでループします。これが役に立てば幸い、AndroidとiOSの両方で機能します。
Androidでテストが実行されている場合は、selectAllを使用できます。
テキスト全体を選択し、Deleteキーを押します。
appiumの組み込みのclearメソッドの使用を控えたい場合があります。
androidに削除キーイベントを送信するadb Shell input keyevent 67を使用してみてください。これはすべてのバージョンでほぼ機能します。
テキストフィールドを2回クリックするだけで、テキストを強調表示できます。
WebElement mob = driver.findElement(By.tagName( "editText"));
これにより、最初のtextField avilableが見つかります。Seleniumバインディングの他のメソッドと同様に、findElementsを試し、配列内のすべてのテキストフィールドを取得して、操作するものを選択できます。
次に、入力キーイベント67を送信してフィールド全体を削除します。
同じ問題に直面しましたが、適切な解決策が1つ見つかりました。
public void clearTextBox(WebElement element) throws Exception
{
element.click();
element.sendKeys(Keys.CONTROL + "a");
element.sendKeys(Keys.DELETE);
}
それは確かに動作します。
私は最近同様の問題に直面しました。私がしたこと、_equals ""
_の場合は編集テキストからテキストを取得し、次にclear()
メソッドと呼ばれるキーを送信します。
最近のiOS 8.xエラーを回避するために、私は以下を使用します(byは、テキストフィールド/テキストビューを表すByのインスタンスです):
int stringLength = driver.findElement(by).getText().length();
if (stringLength > 0) {
driver.findElement(by).clear();
}
すでにクリアされているテキストフィールドに対してclear()を呼び出そうとすると、私はappiumでエラーが発生する傾向がありました。
テキストフィールドにあらかじめ指定された携帯電話番号が含まれている場合は、次のようにしてください。
WebElement mob = driver.findElement(By.name( "xxxxxxxxxx")); mob.clear();
xxxxxxxxxx:アプリケーションを開くときに事前に指定された携帯電話番号。
それ以外の場合は、By.xpathやBy.id(Androidおよび機能としてSelendroidをテストしている場合)などのような、他の検索手法を使用します。
この方法はうまくいきましたが、より良い解決策を模索しています。その間、この方法を使用してください。
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);
}
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)
この問題は、最新バージョンのappiumを使用することで解決できます。古いバージョンでは、長いテキストの場合、clearがすべてのテキストフィールドをクリアしないことがあります。
これはログイン画面に関するものなので、スクリプトを実行するたびにアプリを再起動し、アピアムに移動してAndroid設定でフルリセットを確認してください。
私はcucumber
とRuby
を使用してテストを記述していますが、これは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
私は同じ問題に直面しました。
キーをクリックして、クリアして送信しようとしたところ、うまくいきました。
このコードを参照
driver.findElement(By.name("address").click();
driver.findElement(By.name("address").clear();
driver.findElement(By.name("address").sendKeys("something");`
IOSアプリを自動化しているときに特定のフィールドをクリアできなかったため、この問題を解決するのに苦労しました
他の代替手段も使用できなかったので、これは私の場合うまくいきました!
1.キーボードの削除ボタンのXPathを取得してループし、クリックメソッドを使用してそれをクリアしますこれは私の場合に機能したものです
for(int x=1;x<6;x++)
{
driver.findElementByXpath("//XCUIElementTypeKey[@name='Delete']").click;
}
driver.findElement(By.name("Mobile Number")).clear();
これは私にとってはうまくいきます。 idでfind要素を使用してから、clearを呼び出しています。
wd.findElement(By.id("username")).clear();
これにより、私の場合、ユーザー名フィールドに事前に入力されたデータが消去されます。
私はpythonを使用していますが、これは私が使用するものです:
self.driver.find_element_by_id(element_id).click()
self.driver.find_element_by_id(element_id).send_keys('')
お役に立てば幸いです。
これは通常、アプリで開いている画面が「WebView」の場合に発生します。
同様の問題に直面したとき、私は以下の手順に従いました:
以下は、問題の解決に役立つコードです。
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 (「テキストフィールドに入力する値」); //テキストフィールドに値を入力します
WebElement element2 = appiumDriver.findElement(By.xpath(element));
element2.sendKeys(Keys.CONTROL + "a");
element2.sendKeys(Keys.DELETE);
私のために働いています:
action.longPress(WebElement).perform();
WebElement.clear();
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();
これは私にとってはうまくいきましたが、あなたの要件に従ってコードを操作する必要があるかもしれませんので、ありがとうございます。
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++;
}
私にとって助けとなったのは、クリアの前に空のsendKeysを追加することでした。
このような:
public void sendKeysToElement(WebElement element, String keys) {
element.sendKeys("");
element.clear();
element.sendKeys(keys);
driver.hideKeyboard();
}
このメソッドは、すべての入力フィールドに使用されます。空のsendKeysがないと、すべてのフィールドが適切にクリアされませんでした。
ダブルタブを使用していて、空のキーをフィールドに送信しています。これは、UIテストで安定して動作します。
new TouchAction<>((AndroidDriver<?>) driver).tap(new TapOptions().withTapsCount(2).withElement(new ElementOption().withElement(element))).perform();
element.sendKeys("");