【问题标题】:Appium Android How to tap using the TEXT valueAppium Android 如何使用 TEXT 值点击
【发布时间】:2020-12-04 21:31:11
【问题描述】:

我想通过让 Appium 点按歌曲名称来播放歌曲。是否有代码可以让我使用 TEXT 字段点击任何元素?我不能在这里使用资源 id 字段,因为稍后会有多首歌曲。我尝试使用By.xpath("//android.widget.EditText[@text='"+song name+"']");,但没有奏效。

【问题讨论】:

    标签: java android appium


    【解决方案1】:

    您在 xpath 中的类名错误。

    根据我在 uiautomatorviewer 上看到的应该是以下内容

    By.xpath("//android.widget.TextView[@text='"+songname+"']");
    

    【讨论】:

    • 是的,这是一个错字,但不幸的是,您编写的解决方案与我在代码中尝试过的解决方案相同,但它不起作用。
    • 这是找到它的正确方法。当您尝试使用它运行时会返回什么?可能存在视图分层问题,不允许您点击元素在 z 轴上的位置。我以前见过这种情况,通常通过让我的开发人员清理损坏的视图模型来修复它。当您尝试点击该元素所在的区域时会发生什么(您可以在边界内构成坐标)?
    【解决方案2】:

    找到了解决方案。我必须在测试中编写以下代码:

    capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);
    

    现在我可以通过在 XPath 中写入歌曲名称来使用 TEXT 值,如下所示:

    By.xpath("//*[@text='" + element + "']");
    

    这里的元素是UIAutomatiorViewer中显示的文本值。

    【讨论】:

      【解决方案3】:
      There is no need to using custom xpath for this.
      First you have to take all the elements with that resource ID and click on required element if it contains the text on which you want to click.
      You can use the below code.
      
          List<WebElement> elements = driver.findElements(By.id("resource-id"));
          For(WebElement element:elements)
          {
              if(element.getText().equals("textProperty"))
              {
                  element.click();
                  break;
              }
          }
      

      【讨论】:

        【解决方案4】:

        如果@bsk 答案不起作用。可能是换行的原因...

        你能试试这个来验证吗?

        By.xpath("//android.widget.TextView[contains(@text, 'Ishq De Fanniyar (Female)')]");
        

        使用@resource-id 也不是一个坏习惯......

        By.xpath("//android.widget.TextView[@resource-id='com.xefyr.ridez:id/tv_song_title' and contains(@text, 'Ishq De Fanniyar (Female)')]");
        

        【讨论】:

        • 您的第一个解决方案不起作用。不幸的是,我不能在这里使用资源 ID,因为稍后会有多首歌曲,并且每一首歌曲都将具有相同的资源 ID。我正在尝试编写一个框架,因此我必须使其对非程序员尽可能通用和简单。他/她需要做的就是根据 UIAutomator 中显示的文本值提及歌曲的名称。我不明白为什么这在 Appium 中不起作用。
        • 第一。即使每首歌曲都具有相同的 ID,第二个解决方案的运行速度也会更快……正如您所见,@resource-id='' AND @text=''。第二。你可以尝试改变 //android.widget.TextView 为 //* 如果你没有运气......也许这个(一小段文字)? by.xpath("//*[contains(@text, 'Ishq')]");
        • 顺便说一句...您的屏幕截图来自 AndroidAutomationViewer.bat。您为什么不尝试从 appium 本身进行检查?你的 Appium 版本是多少?建议你更新到最新版本的appium-desktop
        • 还是不行。即使我只使用显式等待,Appium 也会无限期地搜索 FindElement 方法。与您的两个建议。我还尝试使用 MobileBy.AndroidUIAutomator("new UiSelector().resourceId(\"com.xefyr.ridez:id/tv_song_title\").textContains(\"Ishq\");"); 通过 UIAutomator 技术进行搜索。在调试窗口中,我可以看到 [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Using: UiSelector[CONTAINS_TEXT=Ishq, RESOURCE_ID=com.xefyr.ridez:id/tv_song_title] 但它仍然失败,没有元素找到消息。
        • 那么使用 appium-desktop 呢?
        猜你喜欢
        • 2019-08-08
        • 2019-03-10
        • 1970-01-01
        • 2015-05-31
        • 2021-04-04
        • 2016-03-23
        • 2020-05-01
        • 2016-10-26
        • 2021-07-18
        相关资源
        最近更新 更多