【问题标题】:How to "tap" and/or "press" a button using Appium / webdriverio?如何使用 Appium / webdriverio“点击”和/或“按下”按钮?
【发布时间】:2020-02-15 16:55:34
【问题描述】:

我试图在我的应用程序启动后,使用 XPath 选择器在按钮元素上执行点击/按下操作。这个应用程序是一个混合应用程序(本机 + 一些 webviews)。

我遇到了一些问题,因为 Appium 的文档似乎具有误导性(可能)。

getDriver():

  const driver = await remote({
    capabilities: {
      platformName: 'IOS',
      browserName: 'mobileOS',
      deviceName: config.deviceName,
      securityToken: config.securityToken,
      app: 'PUBLIC:my-app.ipa'
    },
    hostname: config.hostname,
    path: config.path,
    port: config.port,
    logLevel: config.logLevel
  });

以下是我启动和运行驱动程序的方法。这将启动设备,并打开我安装的应用程序。

我尝试执行点击或按下或单击操作:

const el = driver.$('//*[@name="MyButton"]');
driver.touchPerform([
      { action: 'press', options: { element: el } },
      { action: 'release'}
    ]);

我得到的错误是: 由于 java.util.LinkedHashMap 无法转换为 java.lang.String 导致请求失败

const el = driver.$('//*[@name="MyButton"]');
driver.touchPerform(
      { action: 'tap', options: { element: el } }
);

我得到的错误是: 获取 WebDriver 时出错:touchPerform 命令的“actions”参数类型错误 预期:对象[] 实际:对象

现在,我最初关注这个文档:http://appium.io/docs/en/commands/interactions/touch/tap/ 和/或http://appium.io/docs/en/commands/interactions/touch/touch-perform/

现在我可以理解为什么 touchPerform( press ) 可能无法工作,因为它在其他文档中指定它只能潜在地使用 x,y。

但水龙头是什么让我失望。如果我将在 driver.touchPerform 中发送的对象包装在一个数组中,如下所示:

const el = driver.$('//*[@name="MyButton"]');
driver.touchPerform([
      { action: 'tap', options: { element: el } }
]);

我得到与上一个相同的错误:Request failed due to java.util.LinkedHashMap cannot be cast to java.lang.String

我的问题是,我是否使用了错误的选择或触摸类型事件来点击移动设备上的按钮?

我也尝试过http://appium.io/docs/en/commands/element/actions/click/ 方法,当我尝试时它告诉我driver.$(..).click() is not a function

非常感谢任何帮助。

【问题讨论】:

    标签: javascript ios appium webdriver-io perfecto


    【解决方案1】:

    对于遇到此类问题的任何人,我终于找到了问题的答案。

    即使我使用的是 webdriverio 版本,第一个例子是:http://appium.io/docs/en/commands/element/find-element/

    应该有效,但无效。这实际上是我找到元素的第三个示例。

    await driver.findElement('name', selector);
    

    我遇到的另一个问题是与 Perfecto 相关的 XPath 是错误的。在 javascript 中,我的 xpath 本来可以工作,但 perfecto 非常明确地定义了它的 xpath。 您需要(在 Perfecto 上)转到旧实验室结构中的自动化选项卡。转到“Object Spy”,您将能够单击类似于 Chrome Inspect 工具的元素。

    我认为 XPath 是 '//*[@name="MyButton"]',但实际上它是://AppiumAUT/XCUIElementTypeApplication[1]/XCUIElementTypeWindow[3]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeNavigationBar[1]/XCUIElementTypeButton[2] 我真正需要做的是正确使用定位器策略。

    findElement(locator strategy, selector)
    

    定位器策略在这里:http://appium.io/docs/en/commands/element/find-elements/index.html#selector-strategies

    然后点击:

    driver.elementClick(element.ELEMENT);
    

    这在 appium 文档或 webdriverio 文档中是没有的。但是有些人在 appium 的示例代码中挖掘了 git。这个方便的花花公子示例代码用于基本交互: https://github.com/appium/appium/blob/master/sample-code/javascript-webdriverio/test/basic/ios-basic-interactions.test.js

    【讨论】:

      【解决方案2】:
      import io.appium.java_client.TouchAction;
      import io.appium.java_client.touch.WaitOptions;
      import io.appium.java_client.touch.offset.PointOption;
      
      
      
      TouchAction leftToRight = new TouchAction(driver);
                  leftToRight.press(PointOption.point(500, 650)).waitAction(WaitOptions.waitOptions(Duration.ofMillis(1300))).moveTo(PointOption.point(60, 650)).release().perform();
      

      【讨论】:

      • 导入 TouchAction : 导入 io.appium.java_client.TouchAction;导入 io.appium.java_client.touch.WaitOptions;导入 io.appium.java_client.touch.offset.PointOption;
      猜你喜欢
      • 2016-10-26
      • 2020-06-27
      • 1970-01-01
      • 2020-05-04
      • 2021-12-24
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多