【问题标题】:webdriver node js get multile link under class tagwebdriver node js在类标签下获取多个链接
【发布时间】:2018-12-17 19:33:57
【问题描述】:

如何获取多个链接下的class标签,HTML包含多个多个class tag="blog-item-wrap" 每个标签都包含tag。需要获取class标签下的所有href链接

<div class="blog-item-wrap">
            <a href="https://website.com/data-wrangling-with/" title="Data 
Wrangling with JavaScript">
                        </a>
   </div>
  <div .... >
  <div class="blog-item-wrap">
            <a href="https://website.com/data-wrangling-with/" title="Data 
    Wrangling with JavaScript">
                        </a>
    </div>
     </div>

使用它并得到错误:

StaleElementReferenceError:过时的元素引用:元素未附加到页面文档

browser.findElement(By.xpath('//*[@class="blog-item-wrap"]/a')).then(res => {  res.getText().then(text => { console.log('text', text); }).catch(err => { console.log('err', err); });

【问题讨论】:

  • 你是怎么尝试的?分享您的代码和异常日志
  • 基于这个答案:stackoverflow.com/questions/5543724/… 你应该使用 XPATH //div[contains(@class, 'ui-autocomplete')]/a
  • browser.findElement(By.xpath('//*[@class="blog-item-wrap"]/a')).then(res => { console.log(res) ; res.getText().then(text => { console.log('text', text); }).catch(err => { console.log('err', err); });
  • 尝试这个但得到错误 UnhandledPromiseRejectionWarning: StaleElementReferenceError: stale element reference: element is not attach to the page documen

标签: javascript selenium selenium-webdriver


【解决方案1】:

您应该在所有带有driver.findElements(By.xpath('//*[@class="blog-item-wrap"]/a')) 的元素上使用getAttribute("href")

然后使用getAttribute("href") 迭代列表。

你应该考虑使用async...

希望对您有所帮助!

【讨论】:

  • 兄弟,我是新人,你能用代码格式解释一下吗
  • browser.findElement(By.xpath('//*[@class="blog-item-wrap"]//a')).then(res => { res.getAttribute(" href") .then(text => { console.log('text: ', text) }) 这给我一个链接你能告诉我如何获取所有链接谢谢
  • 只需将browser.findElement 更改为browser.findElements
【解决方案2】:

出现错误是因为从页面中删除或修改的元素尝试使用Promise 并使用findElements() 获取所有元素。

browser.get('https://..........')
.then(() => {
  browser.findElements(By.xpath('//*[@class="blog-item-wrap"]//a'))
  .then(res => {
    var links = res.map(aTags => aTags.getText()) // .getAttribute("href")
    Promise.all(links).then(texts => {
      texts.forEach(text => console.log('text: ', text))
    })
  })
  .catch(err => {
    console.log('err: ', err);
  });
})

Promise

browser.get('https://....')
  .then(() => {
    browser.findElements(By.xpath('//*[@class="blog-item-wrap"]//a'))
    .then(res => {
      res.forEach(aTags => {
        aTags.getText()
        //aTags.getAttribute("href")
        .then(text => console.log('text: ', text))
        .catch(err => console.log('err: ', err))
    })
  })
})

【讨论】:

  • res = WebElement {driver_: thenableWebDriverProxy, id_: Promise} driver_:thenableWebDriverProxy {session_: Promise, executor_: Executor, fileDetector_: null, ...} id_:Promise { resolved } should:Proxy proto:Object {constructor: , getDriver: , getId: , ...} res.map is not a function error
  • 我可以知道页面的网址
  • 它可以找到,除非在 xpath 中需要将 /a 更改为 //a 并确保您使用的是最新的 chromedriverChrome
  • 使用非 Promise 也返回预期结果,请参阅编辑后的答案。我猜问题是旧版本的应用程序。
  • UnhandledPromiseRejectionWarning: TypeError: res.forEach 不是函数
猜你喜欢
  • 2022-06-22
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2016-03-28
  • 2022-12-06
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多