appium用JS测试,按坐标点击不起作用

问题描述 投票:0回答:2

基本上我正在模拟器上测试一个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 的技巧是什么?

javascript ios webdriver appium webdriver-io
2个回答
0
投票

解决了。

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 }])

此函数接受输入:

  • 一个操作(上面ActionTypes中列出的操作之一)
  • 距元素中心的 x 和 y 坐标,以像素(数字)为单位
  • 元素元素名称

此处列出的所有其他示例对我不起作用。

我解决了检索

<

>
 日历按钮下的元素并仅查看屏幕即可添加或减去一堆像素的问题。

记住: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 }])
    

0
投票
这对我有用:

const actions = driver.actions({ async: true }); await actions.move({ x: 40, y: 405 }).perform(); await actions.click().perform();
没有文档,我就在尝试。这是我拥有的最有用的资源之一:

https://www.selenium.dev/documentation/webdriver/

© www.soinside.com 2019 - 2024. All rights reserved.