如何使用 Appium / webdriverio "tap" and/or "press" 按钮?
How to "tap" and/or "press" a button using Appium / webdriverio?
我正在尝试在我的应用程序启动后使用 XPath 选择器对按钮元素执行 tap/press 操作。这个应用程序是一个混合应用程序(本机 + 一些网络视图)。
我遇到问题,因为 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/
and/orhttp://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
非常感谢任何帮助。
对于遇到此类问题的任何人,我终于找到了问题的答案。
即使我使用的是第一个示例的 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 检查工具的元素。
我认为的 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
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();
我正在尝试在我的应用程序启动后使用 XPath 选择器对按钮元素执行 tap/press 操作。这个应用程序是一个混合应用程序(本机 + 一些网络视图)。
我遇到问题,因为 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/ and/orhttp://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
非常感谢任何帮助。
对于遇到此类问题的任何人,我终于找到了问题的答案。
即使我使用的是第一个示例的 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 检查工具的元素。
我认为的 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
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();