Webdriverio TypeError:element.click 不是函数

Posted

技术标签:

【中文标题】Webdriverio TypeError:element.click 不是函数【英文标题】:Webdriverio TypeError: element.click is not a function 【发布时间】:2019-05-21 01:31:40 【问题描述】:
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。当我把它拿回来时,它是一个不同的 obj。

我尝试在 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://***.com/a/47176108/10816010 很有帮助。显然我必须使用同步方法(使用 WDIO 测试运行程序)并让 WDIO 测试运行程序控制同步而不是使用异步等待来获得我想要的功能。

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

【问题讨论】:

嘿吉拉德!好吧,很高兴您找到了解决问题的方法。您没有使用sync: true 标志,在您的场景中,问题接缝是您点击ELEMENT 对象(telm 值),这当然会触发telm.click is not a function TypeError。我会在 const telm = await t(elm); 语句之后放置一个 browser.debug() 并使用结果单击元素( hint, hint! :) )。干杯! 【参考方案1】:

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

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

【讨论】:

我正在尝试使用 click() 函数(如 webdriver.io/api/action/click.htm 中记录的 click.js 示例)在将它传递给 t 后得到的元素。在将其传递给 t 之前,它具有点击功能,而在将其取回之后则没有。 你的函数实现不正确,也许你想要***.com/a/45855452/4103101

以上是关于Webdriverio TypeError:element.click 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

WebdriverIO 与 Selenium Webdriver(Java 方法)

XRAY 和 WebdriverIO 集成

Webdriverio 使用 async/await - 推荐啥? [关闭]

如何在独立模式下调试 webdriverio?

如何使用 WebdriverIO 上传文件

使用 CodeceptJS/WebdriverIO 并行执行浏览器