如何使用Appium / webdriverio“点击”和/或“按下”按钮?

时间:2019-10-18 16:53:13

标签: javascript ios appium webdriver-io perfecto

在我的应用启动后,我试图使用XPath选择器对按钮元素执行点击/按下操作。这个应用程式是混合式应用程式(本机+某些网页检视)

我遇到了一些问题,因为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的“操作”参数格式错误 预期:object [] 实际:对象

现在,我最初遵循以下文档: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 } }
]);

与上一个错误相同:由于java.util.LinkedHashMap无法强制转换为java.lang.String

,导致请求失败

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

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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

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

应该可以,但不能。实际上,这是我找到元素的第三个示例。

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

我遇到的另一个问题是与Perfecto相关的XPath是错误的。在javascript中,我的xpath可以工作,但是perfecto非常明确地定义了它的xpath。 您需要(在Perfecto上)转到旧实验室结构中的“自动化”选项卡。转到“对象间谍”,您将可以单击类似于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。这个方便的dandy示例代码可用于基本交互: https://github.com/appium/appium/blob/master/sample-code/javascript-webdriverio/test/basic/ios-basic-interactions.test.js

答案 1 :(得分:0)

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();