无法在 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

解决scrollView中嵌套编辑框导致不能上下滑动的问题

如何在 Xamarin Android 中清除 EditText