Appium:清除一个字段

时间:2014-03-27 06:33:29

标签: appium

我现在在应用程序中有我的登录屏幕。每次在屏幕上启动应用程序时,手机号码都会预先填入旧文本。

我只是想知道我已经尝试过:

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

我试过了:

String Mobile
mob="";   

但仍无法删除预填充的文字。

我正在尝试使用appium自动化我的Android应用程序,请帮助我。

27 个答案:

答案 0 :(得分:6)

绝对没有效率,可以改进,可能是更好的方式...... 但是,使用adb的shell输入键事件代码我简单地称为" dpad right"将光标一直向右移动。在那里,发送密钥代码" DEL"开始一直删除... 所以...两个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实例。 希望这能有所帮助。

答案 1 :(得分:5)

我也遇到了麻烦。我发现的一个主要问题是,为了通过按删除键删除该区域,它需要点击该行的末尾。这对我有用:

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);
}

这比仅仅清除它要快得多,但我还没弄清楚如何做到这一点。非常适合双击或点击并按住直到选中所有内容。

答案 2 :(得分:5)

在清除之前单击textBox应该使用最新的库:

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

来自样本jUnitTest here

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

我想

答案 3 :(得分:3)

我能够使用下面的代码解决这个问题&#34; textField()。clear()&#34;似乎没有像Genymotion那样在某些设备和模拟器上工作。

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

代码将循环直到textfield被清除。希望这会有所帮助,适用于Android和iOS。

答案 4 :(得分:3)

如果在android上执行测试,我们可以使用selectAll。

  • longPress on textfield
  • 找到并点按selectAll元素(Android全选按钮)
  • sendKeyEvent(67)

它将选择整个文本并按删除。

答案 5 :(得分:2)

您可能希望避免使用appium内置的明确方法。

你可以尝试使用adb shell输入keyevent 67,它会向android发送一个删除键事件。 这几乎适用于所有版本。

您只需单击文本字段两次即可突出显示文本:

WebElement mob = driver.findElement(By.tagName(&#34; editText&#34;));

可以找到第一个textField可用,就像selenium绑定中的其他方法一样, 您也可以尝试使用findElements,并获取数组中的所有文本字段,您可以选择您想要操作的任何文本字段。

然后,发送输入keyevent 67以删除整个字段。

答案 6 :(得分:1)

为了避免最近的iOS 8.x错误,我使用以下内容(其中by是By表示textfield / textview的实例):

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

如果您尝试针对已经清晰的文本字段调用clear(),我倾向于在appium中出错。

答案 7 :(得分:1)

我遇到了同样的问题,但我找到了一个合适的解决方案。

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

它肯定会起作用。

答案 8 :(得分:1)

我最近遇到了类似的问题。我做了什么,如果是equals "",则从编辑文本中获取文本,然后发送名为clear()方法的其他密钥。

答案 9 :(得分:1)

这种方法对我有用,虽然我正在努力寻找更好的解决方案。在此期间,请使用此方法。

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);

}

答案 10 :(得分:1)

如果文本字段包含任何预先指定的手机号码,请按以下方式进行操作。

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

xxxxxxxxxx:打开应用程序时预先指定的手机号码。

否则使用其他一些定位技术,如By.xpath,By.id(如果您正在测试android和Selendroid作为功能)等。

答案 11 :(得分:0)

经过验证的IOS模拟器或设备清除文本的方案

MobileElement element = driver.findElement(By.id("id_data"));
Rectangle rectangle = element.getRect();
int YAxis = element.getCenter().getY();
int XAxis = rectangle.getWidth();
TouchAction action = new TouchAction(this.getIOSDriver());
action.tap(TapOptions.tapOptions().withPosition(PointOption.point(XAxis, 
YAxis))).perform();
element.clear();

在带有 appium 1.21.0 的模拟器 iOS 14.3 上验证

答案 12 :(得分:0)

我正在使用一个双标签,并向该字段发送一个空密钥。在我的UI测试中,此功能稳定。

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

答案 13 :(得分:0)

为我工作:

action.longPress(WebElement).perform();
WebElement.clear();

答案 14 :(得分:0)

我很难解决这个问题,因为ios APP无法自动清除特定字段

也无法使用任何其他替代方法,因此在我看来是可行的!

1。获取键盘的“删除”按钮的XPath,然后将其循环并使用click方法清除它,这在我的情况下是有效的

for(int x=1;x<6;x++)
{
    driver.findElementByXpath("//XCUIElementTypeKey[@name='Delete']").click;
}

答案 15 :(得分:0)

我使用cucumberruby来编写我的测试,这对我来说适用于iOS和Android。

arg1arg2是我在gherkin步骤中提供的输入值。

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

答案 16 :(得分:0)

对我有帮助的是在清除之前添加一个空的sendKeys。

像这样:

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

此方法用于我们的所有输入字段。没有空的sendKeys,它没有正确清除所有字段。

答案 17 :(得分:0)

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)

答案 18 :(得分:0)

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();

请注意这对我有用,但您可能需要按照您的要求操作您的代码,谢谢。

答案 19 :(得分:0)

    WebElement element2 = appiumDriver.findElement(By.xpath(element));
        element2.sendKeys(Keys.CONTROL + "a");
         element2.sendKeys(Keys.DELETE);

答案 20 :(得分:0)

使用最新版本的appium可以克服这个问题。在旧版本中,如果文本较长,有时不会清除所有文本字段。

答案 21 :(得分:0)

对于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++;
    }

答案 22 :(得分:0)

我正在使用python,这就是我使用的:

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

我希望它有所帮助。

答案 23 :(得分:0)

这是关于登录屏幕所以我建议每次运行脚本时重新启动应用程序,转到appium并检查Android设置中的完全重置。

答案 24 :(得分:0)

我遇到了同样的问题。

尝试点击,清除并发送密钥,它有效。

查看此代码

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

答案 25 :(得分:0)

driver.findElement(By.name("Mobile Number")).clear();
这对我有用。我通过id使用find元素然后调用clear。

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

在我的情况下,这将清除字段用户名中预先输入的数据。

答案 26 :(得分:0)

这通常发生在您的应用中打开的屏幕是&#34; WebView&#34;。

遇到类似问题时,我按照以下步骤操作:

     
  1. 使用&#34; getAttribute&#34;获取文本字段的值,即预填充文本。方法。然后,检索字符串的长度,以便知道要删除的字符数

  2.  
  3. 点击文字字段。

  4.  
  5. 使用&#34;删除按钮&#34;删除文本字段内的字符iOS键盘的元素。

  6.  
  7. 在文本字段中填写必要的值。
  8. 下面是可能帮助您解决问题的代码:

    WebElement ele = driver.findElement(By.xpath("//Locator of the textfield")); //Locating the textfield
    
    int characters_to_delete = ele.getAttribute("value").length();//Counts the number of characters to delete
    
    ele.click(); //Tapping or Clicking on the textfield
    
    // Deleting or Clearing the textfield off of the prefilled values
    for(int i=0;i<characters_to_delete;i++){
     driver.findElement(By.xpath("//Locator of the Keyboard button 'Delete' ")).click();
    }
    
    ele.sendKeys("value to be filled in the textfield"); //Filling the textfield with the value