猿问

迭代中的 StaleElementReferenceError

我的应用程序从数据库中获取 ID 列表。我用游标遍历这些,对于每个 ID,我将它插入带有 Selenium 的 URL 以获取页面上的特定项目。这是对关键字进行搜索并获得与该搜索最相关的项目。数据库中有大约1000 个结果。在随机迭代中,驱动程序中的 1 个操作将抛出一个StaleElementReferenceError完整的消息:


过时的元素引用:元素未附加到页面文档\n(会话信息:chrome=77.0.3865.75)


查看官方文档,我可以看到导致此问题的两个常见原因是:


该元素已被完全删除。

该元素不再附加到 DOM。

前者是最常见的原因。


index.js


const { MongoClient, ObjectID } = require('mongodb')

const fs = require('fs')

const path = require('path')

const { Builder, Capabilities, until, By } = require('selenium-webdriver')

const chrome = require('selenium-webdriver/chrome')


require('dotenv').config()


async function init() {

    try {

        const chromeOpts = new chrome.Options()

        const ids = fs.readFileSync(path.resolve(__dirname, '..', 'data', 'primary_ids.json'), 'utf8')

        const client = await MongoClient.connect(process.env.DB_URL || 'mongodb://localhost:27017/test', {

            useNewUrlParser: true

        })

        const db = client.db(process.env.DB_NAME || 'test')

        const productCursor = db.collection('product').find(

            {

                accountId: ObjectID(process.env.ACCOUNT_ID),

                primaryId: {

                    $in: JSON.parse(ids)

                }

            },

            {

                _id: 1,

                primaryId: 1

            }

        )

        const resultsSelector = 'body #wrapper div.src-routes-search-style__container--2g429 div.src-routes-search-style__products--3rsz9'

        const mostRelevantSelector = `${resultsSelector}

            > div:nth-child(2)

            }

        }


为了调试,我try...catch在每个驱动程序操作周围放置了一个,以查看它是哪个特定操作失败但不起作用,因为它从来都不是失败的一致操作。例如,有时如果本来是其中elementLocated一行或其他行,则它只是getAttribute动作。


如果在那种情况下是后者,这就是为什么我很困惑为什么会抛出这个错误,因为 selenium 肯定已经在页面上找到了元素(即link)但无法getAttribute('src')在元素上做?这就是为什么我对我得到的错误感到困惑。我想我在设置 selenium 以处理迭代的方式上一定做错了。迭代次数永远不会超过110


哔哔one
浏览 235回答 3
3回答

慕哥6287543

您无需等待 Ajax 请求完成。该网站会在您结束时检索并刷新 dom,并且每隔几秒钟就会不断调用 index,因此 DOM 可能会不断更新。您可能可以保留 AJAX 请求、获取结果、处理并再次启用 AJAX。

子衿沉夜

您可以尝试从 img Src = await img.getAttribute('src') 中删除“await”吗?由于等待 img 已在其前一行中处理。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答