无法在 EditText 字段中发送密钥
Posted
技术标签:
【中文标题】无法在 EditText 字段中发送密钥【英文标题】:Unable to sendKeys in an EditText field 【发布时间】:2019-09-28 16:08:48 【问题描述】:我在特定 EditText
字段中执行发送密钥时遇到问题。我尝试了一个脏的 xpath 和 id,但它仍然没有进入文本字段。但是我觉得找到元素没有问题。然而,它并没有点击进入元素。
所以在应用中发生的情况是,当用户选择页面时,它会打开一个 Web 视图,并且 EditText
字段位于该 WebView
中。
这是我从 appium 检查器那里得到的脏 xpath:
/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.ScrollView/android.view.ViewGroup/android.view.ViewGroup/android.support.v4.view.ViewPager/android.view.ViewGroup/android.widget.EditText[1]
这是一个不错的 ID:
@FindBy(id = "test_number")
public WebElement testNumberTextField;
我也尝试使用脏 xpath 使用 find by xpath。
这是我尝试输入文本的方法。您可以通过注释代码看到我也尝试了其他方法以使其正常工作,但仍然没有成功:
public void enterTestNumber()
//List<WebElement> menu22 =drive.getDriver().findElements(By.className("android.widget.EditText"));
// menu22.get(1).sendKeys(randomStringGeneratorMethods.randomAlphaNumericString(7));
testPage.testNumberTextField.sendKeys(randomStringGeneratorMethods.randomAlphaNumericString(7));
//js.executeScript("document.getElementById('"+testPage.testNumberTextField+").value='"+randomStringGeneratorMethods.randomAlphaNumericString(7)+"';");
随机生成器只是一个随机字符串生成器,它是这样的:
public String randomAlphaNumericString(int characterLength)
return RandomStringUtils.randomAlphanumeric(characterLength);
有谁知道如何让它工作,以便它可以在这个 EditText
字段中输入文本?
【问题讨论】:
您的 menu22 尺寸是多少?您收到testNumberTextField
的任何错误消息吗?
它没有输出尺寸也没有给我一个错误。我尝试了 system.out.println 但没有输出。我可以尝试添加大小并运行它,但服务器现在一直关闭到星期一
如果一个元素是“editText”,那么它就不会出现在 Web 视图中。如果这是一个原生或混合应用程序,请添加您的 UIAutomator 屏幕的屏幕截图,或者如果这是一个网络应用程序,请通过指向确切元素的 chrome 浏览器添加适当的 html 代码。
@Brucey 您对答案感到满意,或者您需要更多帮助或建议
我意识到没有问题,它不起作用的原因是我必须在运行它之前进行 mvn clean 测试。它没有更新我的 sendKeys 代码,这就是它没有输入的原因。我以前不必做 mvn clean text 但现在看来我必须在运行测试之前做
【参考方案1】:
由于元素在 webview 中,您需要使用 chrome/firefox 查找元素 html,因为 android ui automator 将无法检测到该元素。
要获取元素的html,您需要将您的设备与chrome连接并转到chrome://inspect
,现在在您的应用程序中操作并打开webview,您将在chrome://inspect
链接中找到您的设备webview被打开,你需要从那里选择你的设备,你会看到webview的副本,从那里你可以检查元素并找到元素的html,并使用该html你可以获得xpath。
现在您已经获得了 xpath,您只需现在将驱动程序从您的代码切换到 webview,然后您可以使用sendKeys()
方法在字段中输入值。
【讨论】:
【参考方案2】:我没试过,但你可以发送 adb shell 命令输入文本。单击元素后。
具有 Appium 移动命令功能。
https://appium.io/docs/en/commands/mobile-command/
【讨论】:
【参考方案3】:如果页面加载后焦点不在文本文件中,则需要:
element.click();
之前
element.sendKeys();
【讨论】:
【参考方案4】:由于您能够找到该元素,但似乎无法与之交互,因此可以使用其坐标来代替。
-
单击坐标将焦点设置在元素上。
在不指定元素的情况下输入键。
我没有java经验,所以这里有一些伪代码给你一个大概的想法:
item = driver.findElementByAccessibilityId("test_number");
driver.Mouse.Click(item.coordinates);
driver.pressKey(new KeyEvent(AndroidKey.ENTER));
您可能需要迭代随机字符串并将 pressKey 函数放入该循环中以按下每个键。
【讨论】:
【参考方案5】:我曾经在文本字段输入方面遇到过问题,这很有帮助。
driver.update_settings("ignoreUnimportantViews":True)
【讨论】:
以上是关于无法在 EditText 字段中发送密钥的主要内容,如果未能解决你的问题,请参考以下文章
安卓开发者进来一下,安卓悬浮窗口开发有问,悬浮的EditText为啥无法获得焦点.悬浮窗口不管我
如何使用android中的共享首选项将数据保存在editText中[重复]
当我在导航抽屉中使用带有发送片段的 EditText 时,无法解析片段中的方法“findViewById”? [复制]
安卓出现错误: java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.EditT