Node.js WebDrivero类型错误:元素。单击不是函数

Node.js WebDrivero类型错误:元素。单击不是函数,node.js,webdriver-io,Node.js,Webdriver Io,我正在尝试用appium和WebDrivero自动化一个android应用程序,我有一个非常奇怪的bug。我使用webdriver的$function(元素函数也是如此)来定位元素,然后将其传递给函数t。当我把它拿回来时,它是一个不同的对象 我试图在getByResourceId的第一行和第二行之间添加延迟,以确保这不是一个计时错误: async function t(e){ return e; } async getByResourceId(id, wait= 5000){

我正在尝试用appium和WebDrivero自动化一个android应用程序,我有一个非常奇怪的bug。我使用webdriver的$function(元素函数也是如此)来定位元素,然后将其传递给函数t。当我把它拿回来时,它是一个不同的对象

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

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);
}
那没用。打破榆树的事情不是还清诺言。有人知道如何让它工作吗

编辑:我发现这非常有用。显然,为了获得我想要的功能,我必须使用同步方法(使用WDIO测试运行程序),让WDIO测试运行程序控制同步,而不是使用异步等待


编辑2:这与webdriverio版本5无关

假设您启动驱动程序如下:

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)
        }
您可以使用:


您可以检查wdio示例

我正在尝试使用元素的click()函数(如中的click.js示例所述),该元素是在将其传递给t之后获得的。在将其传递给t之前,它有一个单击函数,而在将其返回后,它没有。您的函数的实现不正确,可能您想要像Hey Gilad这样的smth!很高兴你找到了解决问题的方法。您不必使用
sync:true
标志,在您的场景中,问题在于您单击
元素
对象(
telm
值),这当然会触发
telm。单击不是函数
TypeError。我会在
const telm=await t t(elm)之后放一个
browser.debug()
语句并使用结果单击元素(提示,提示!:)。干杯
const driver = await remote({
   port: 4723,
   logLevel: 'debug',
   desiredCapabilities: {
     // your caps here
   }
})
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
  })
}