基本上我正在模拟器上测试一个iOS应用程序,用
react-native
编写,使用带有XCUITest
和webriver
的appium。
我注意到我无法通过位于日历(用于选择月份)上的定位器“下一个”和“上一个”按钮来访问,该按钮放置在模态上。
所以我决定尝试通过坐标点击策略来点击它:我用appium检查器检索了坐标,并且我尝试了以下操作:
配置文件中的设置(注意,如果有任何区别,我已经设置了
'appium:nativeWebTap': true
:
capabilities = [
{
// the path for appium server
path: '/wd/hub',
// The defaults you need to have in your config
platformName: 'iOS',
maxInstances: 1,
// For W3C the appium capabilities need to have an extension prefix
// This is `appium:` for all Appium Capabilities which can be found here
// http://appium.io/docs/en/writing-running-appium/caps/
'appium:deviceName': 'iPhone 8',
'appium:platformVersion': '15.5',
'appium:orientation': 'PORTRAIT',
// `automationName` will be mandatory, see
// https://github.com/appium/appium/releases/tag/v1.13.0
'appium:automationName': 'XCUITest',
// The path to the app
'appium:app': join(process.cwd(), './app_test/myApp.app'),
// Read the reset strategies very well, they differ per platform, see
// http://appium.io/docs/en/writing-running-appium/other/reset-strategies/
'appium:noReset': false,
// How long (in seconds) Appium will wait for a new command from the client before assuming the client quit and ending the session
// default: 240
'appium:newCommandTimeout': 500,
'appium:autoGrantPermissions': true,
'appium:autoAcceptAlerts': true,
'appium:nativeWebTap': true,
// make process headless
'appium:isHeadless': false,
'appium:settings[snapshotMaxDepth]': 60
}
我的测试文件:
describe('Testing', () => {
it('Test tap', async () => {
//TEST:
await driver.setTimeouts(30000)
// first try
await driver.touchAction({ action: 'tap', x: 323, y: 225 })
// second try
await driver.execute('mobile: tap', { x: 323, y: 225 })
// just to avoid instant disappearing
await browser.pause(10000)
})
})
两者都不起作用:我的意思是没有发生点击。我还注意到,虽然 iphone8(我认为模拟器)的分辨率为 750x1334,但 appium 检查器中的最大 x 和 y 坐标为 375x666。
所以我只做了一个比例
323:375=x:750 //x=646
225:666=x:1334. //y=451
我使用
646, 451
作为坐标,但没有用。
所以,我的想法是我写的代码根本根本不点击。
我做错了什么?在 appium 中使用坐标进行简单 TAP 的技巧是什么?
解决了。
TL:博士; => 转到答案底部的最后一个代码块。
由于 webdriverIO documentation 和 appium documentation 中缺乏文档,我尝试了无数次,无数的选项。
所以,尝试之后:
// not working with iphone simulator and XCUITest
await browser.touchAction({
action: 'tap',
x: 295,
y: 200
})
// not working with iphone simulator and XCUITest
await driver.execute('mobile: tap', { x: 600, y: 400 })
// not working with iphone simulator and XCUITest
await elem.touchAction({ action: 'click', x: 320, y: 290 })
// not working with iphone simulator and XCUITest
await driver.touchAction({ action: 'tap', x: 295, y: 200 })
// not working with iphone simulator and XCUITest
await driver.touchAction({ actions: [{ action: 'tap', options: { x: 295, y: 200 } }] })
还有至少另外几十个命令,我去了 webdriverio github。
我发现了一些有趣的事情,例如这里我找到了touchAction命令的操作列表:
export type ActionTypes = 'press' | 'longPress' | 'tap' | 'moveTo' | 'wait' | 'release';
“release”与其他有点不同,必须像本page的最后一个示例一样使用。
我还找到了当前唯一的工作方式(2022年10月)用JS点击:
await driver.touchAction([{ action: 'tap', x: 0, y: 0, element: elementName }])
此函数接受输入:
此处列出的所有其他示例对我不起作用。
我解决了检索<
和
>
日历按钮下的元素并仅查看屏幕即可添加或减去一堆像素的问题。
记住:appium 检查器中使用的 x 和 y 值不对应于像素。
例如,点击此处显示的<
日历按钮:我必须
// retrieve sunday block
// there's no Id on this calendar element
const sunday = await $(
'-ios class chain:**/XCUIElementTypeOther[`name == "native.calendar.DAY_NAMES"`]/XCUIElementTypeStaticText[1]'
)
// just looked at the above screen I thought the left arrow is more or less 20px above,
//so from the center of the sunday element:
await driver.touchAction([{ action: 'tap', x: 20, y: -20, element: sunday }])