【问题标题】:WebdriverIO: what is the equivalent of elementIdHtml?WebdriverIO:elementIdHtml 的等价物是什么?
【发布时间】:2019-02-15 14:39:56
【问题描述】:

如何使用浏览器对象从elementId 获取元素的内部 HTML?

WebdriverIO API 中有类似elementIdHtml 的东西吗?

v4 的 getHTML 链接返回 403 Forbidden。


我的目标是我需要从 elementId 中获取所有 a._3cnp 中的所有文本

示例 html

<div class="container">
    <a class="_3cnp">first link</a>
    <a class="_3cnp">second link</a>
    <a class="_3cnp">third link</a>
</div>

需要将其转换为 ["first link", "second link", ..]

我已经有了.container elementId

这就是我所做的

.then(() => browser.elementIdElements(someElementId, 'a._3cnp'))
.then(buttonElem => {
    console.log('->', buttonElem)
    console.log('-->', buttonElem.getHTML)
    buttonElem.getHTML().then(x => console.log('---->', x))
    return buttonElem.value
})

elementIdElements 的结果是 按钮元素

{ sessionId: '2e2f144c8895a03da1b8df92f4613a33',
  status: 0,
  value:
   [ { ELEMENT: '0.6603119466268468-24',
       'element-6066-11e4-a52e-4f735466cecf': '0.6603119466268468-24' } ],
  selector: 'a._3cnp' }

但是buttonElem.getHTML 是undefined

我在 botium-webdriverio-connector 中独立使用 webdriverio

【问题讨论】:

    标签: webdriver-io webdriver-io-v4


    【解决方案1】:

    LE:

    相应地更改您的代码:

    .then(() => browser.elementIdElements(someElementId, 'a._3cnp'))
    .then(buttonElem => {
        // buttonElem's 'value' will contain a list of all the matching elements
        // thus, you have to call getHTML() on each item from 'value'
    
        // the following will return the HTML of the first matching element
        console.log('\nPrint element HTML: ' + buttonElem.value[0].getHTML());
        return buttonElem.value[0].getHTML();
    })
    

    更好的方法是在它们之间循环并打印 HTML:

    .then(() => browser.elementIdElements(someElementId, 'a._3cnp'))
    .value.forEach(buttonElem => {
    
        console.log('\nPrint element HTML: ' + buttonElem.getHTML());
        return buttonElem.getHTML();
    })
    

    .getHTML() 属性的作用域是所有 ELEMENT 对象。为了更具有指导意义,我将考虑在无序列表 (&lt;ul&gt;) 的一系列列表项 (&lt;li&gt;) 中找到的操作 HTML 代码 的任务)。

    因此您可以执行以下操作:

    • browser.getHTML('ul.ourList li.ourListItems')(这将返回所有 &lt;li&gt; 的 HTML 代码的列表)
    • browser.element('ul.ourList li.ourListItems').getHTML()(这将返回第一个 &lt;li&gt;'s HTML 代码)
    • $('ul.ourList li.ourListItems').getHTML()(这相当于上面的命令,只是一个宽松的版本)

    如果您需要遍历所有 &lt;li&gt;s 并获取 HTML,请执行以下操作:

    let locator = 'ul.ourList li.ourListItems';
    
    browser.elements(locator).value.forEach(elem => {
      let elemHTML = elem.getHTML();
    
      console.log( JSON.stringify(elemHTML) );
      elemHTML.doSomethingWithIt();
    })
    

    其中,elem 将是一个具有以下格式的对象:

    { ELEMENT: '0.285350058261731-1',
      'element-6066-11e4-a52e-4f735466cecf': '0.285350058261731-1',
      selector: 'ul li.fw-item.fz-16.lh-36.pos-r',
      value: { ELEMENT: '0.285350058261731-1' },
      index: 0 
    }
    

    【讨论】:

    • 我似乎无法让它工作,我更新了我的问题,为您提供更多信息。我认为我使用的是独立版本。
    • 不行,不能做$('div.container'),.container是动态添加的,所以很多.container会实际存在,elementId是实时传给我的,如“这里, 最新的 .container, 随你便”, 问题是我不知道用什么 api。
    • @lamdanchiv ya,我知道我需要打电话给.getHTML(),问题是(正如我在上面编辑过的问题中所说)是 browser.elementIdElements 返回一个 json,或者正如你的文档所说“已定位元素的 WebElement JSON 对象列表。”而且里面没有getHTML函数,所以我不能调用getHTML(),请看上面编辑过的问题。
    • @lamdanchiv browser.element('div._3058').then(elem =&gt; elem.getHTML()).then(console.log) 抛出错误TypeError: elem.getHTML is not a function
    • 啊,是的,忘记通知你了,抱歉。事实证明它非常简单,但是由于找不到有关独立模式的文档,因此变得非常困难。获取html的方式确实是$(selector).getHTML()。但是如果运行在单机模式下,需要直接链接,不要先调用then()。所以应该是这样的browser.elementIdElements(elementId, selector).getHTML().then(html =&gt; console.log('HTML', html))
    猜你喜欢
    • 2014-05-08
    • 2014-06-12
    • 2022-11-28
    • 1970-01-01
    • 2018-07-10
    • 2023-04-10
    • 2011-01-19
    • 2010-12-07
    • 2023-03-16
    相关资源
    最近更新 更多