我正在尝试使用Appium for Android for Wordpress Mobile(https://github.com/wordpress-mobile/WordPress-Android)编写一些自动化测试。
我要做的第一件事就是在主登录界面输入用户名,以便能够登录我的Wordpress网站,而我在“用户名”字段中遇到SendKeys问题。
以下是uiautomatorviewer中元素的显示方式:
这是我到目前为止所尝试的内容:
List<WebElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
WebElement login = textFieldsList.get(0);
login.sendKeys("username");
和
driver.findElementsByClassName("android.widget.EditText").get(0).sendKeys("username");
和
driver.findElement(By.xpath("//android.widget.EditText[@text='Editing. Username or email. ']")).sendKeys("username");
尝试发送“username”作为用户名的所有3个版本,当我运行测试时,该字段中实际输入的内容是:“编辑。用户名或电子邮件。用户名”
因此,似乎还保留了占位符文本,然后添加了我的用户名。
请注意,当我使用appium发送用户名时添加的文本首先不在那里(参见屏幕截图),但在UI树视图中,它似乎是EditText中的文本。当Appium运行测试时,在添加我自己的用户名之前,实际上正在编写“编辑。用户名或电子邮件”文本。
我也尝试过,正如其中一个答案中建议的那样:Appium : Clear a field 以下代码,其中sendKeyEvent(67)应清除该字段:
List<WebElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
WebElement login = textFieldsList.get(0);
login.click();
driver.sendKeyEvent(67);
login.sendKeys("username");
使用.clear()崩溃,我注意到其他人建议尽可能避免它。
当然,如果我尝试手动执行此操作,则不会添加占位符文本,只需键入即可在字段中添加用户名。
我也可以使用driver.sendKeyEvent()函数并发送我的一个字符,但我想将用户名作为参数发送,并能够在字段中键入任何用户名。
因为每当我尝试输入用户名时都会输入额外的文本,要解决此问题,我必须首先输入“用户名” - 在应用程序中,输入的实际文本是“编辑。用户名或电子邮件。用户名” - 然后将光标向左移动到“用户名”字样的前面并开始删除其余部分 - 但这非常慢。以下是以这种方式工作的代码:
String setUsername = "username";
login.click();
login.sendKeys(setUsername);
// hack to delete extra text that gets typed
int stringLength = login.getText().length() - setUsername.length();
for (int i = 0; i < setUsername.length(); i++) {
driver.sendKeyEvent(21); //KEYCODE_DPAD_LEFT
}
for (int i = 0; i < stringLength; i++) {
driver.sendKeyEvent(67); // "KEYCODE_DEL
}
我错过了什么?任何帮助将不胜感激。我试图理解为什么额外的文本被输入。
答案 0 :(得分:3)
经过大量搜索,我发现这确实是Appium v 1.2.2中的一个错误:
https://discuss.appium.io/t/android-appium-1-2-2-sendkeys-issue-with-hinted-edit-text/309
希望正如在那里所说的那样,它将在版本1.2.3中修复。
感谢您的帮助!
答案 1 :(得分:0)
问题是你只使用了一次sendKeyEvent(67)而且没有适当的地方。你要做的是首先将光标设置在Text in Login字段的末尾,然后逐个删除每个字母,直到字段中不再留下任何文本。
例如:尝试这样的事情
WebElement login = textFieldsList.get(0);// Get the webelement where text is to be entered
string str = login.Text;// it will store the Text already written in login field
int textLength = str.Length;// find the lenght of the text that is to be removed
int x = login.Location.X +(textLength * 40); //
int y = login.Location.Y;//
TouchAction action = new TouchAction(driver);// TouchAction class is defined in appium library
action.Tap(testObject, x, y);//
for (int delete = 0; delete < str.Length; delete++)
{
rm.KeyEvent(67);
}
}
希望有所帮助......
答案 2 :(得分:0)
您正在寻找
MobileElement textfield = driver.findElement(By.however(value))
textfield.setValue('foo')
我没有在Android上测试过这个功能,但它是在iOS / Instruments上textfield.sendKeys
不可靠的情况下构建的。
您还可以尝试textfield.click()
,textfield.clear()
,然后textfield.sendKeys('foo')
您需要Appium java-client
答案 3 :(得分:0)
您可能希望降级一个版本,因为我认为此错误在上一版本中不存在。
答案 4 :(得分:0)
我看到您使用了List
并且屏幕截图上有3个文本字段 - 为什么不使用这些字段的索引来传递您的值?这样就无法为其添加额外的文字。
List<WebElement> tfl=driver.findElements(By.className("android.widget.EditText"));
tfl.get(0).sendKeys("username"); // tfl=text field list
tfl.get(1).sendKeys("password");