Webdriverio TypeError:element.click不是函数

时间:2018-12-20 14:01:20

标签: node.js webdriver-io

async function t(e){
    return e;
}

async getByResourceId(id, wait= 5000){
        const elm = this.driver.$('android=new UiSelector().resourceId("'+id+'")');
        const telm = await t(elm);
}

我正在尝试使用appium和webdriverio使android应用程序自动化,但是我遇到了一个非常奇怪的错误。我使用webdriver的$函数(也发生在element函数中)来查找元素,然后将其传递给函数t。当我找回来的时候,它是一个不同的对象。

我试图在getByResourceId的第一行和第二行之间添加一个延迟,以确保它不是计时错误:

async getByResourceId(id, wait= 5000){
            const elm = this.driver.$('android=new UiSelector().resourceId("'+id+'")');
            await _setTimeout(5000);
            //elm still OK (aka elm.click works)
            const telm = await t(elm);
            //telm is broken (aka getting TypeError: telm.click is not a function)
        }

那没有用。打破榆树的事情是没有兑现诺言。有谁知道如何使它起作用?

编辑:我发现此https://stackoverflow.com/a/47176108/10816010很有帮助。显然,我必须使用同步方法(使用WDIO测试运行程序),并且让WDIO测试运行程序控制同步,而不是使用异步等待,以便获得所需的功能。

编辑2:,这与webdriverio的第5版无关。

1 个答案:

答案 0 :(得分:0)

假设您像这样启动驱动程序:

const driver = await remote({ port: 4723, logLevel: 'debug', desiredCapabilities: { // your caps here } })

您可以使用async-retry

async getByResourceId(id, wait=5000){
  return await retry(async bail => {
    const el = await driver.element(`android=new UiSelector().resourceId("${id}")`)
    return el;
  }, {
    retries: 3,
    minTimeout: wait,
    driver: driver
  })
}

您可以查看wdio示例here