使用 JavaScript 在 Selenium 中获取 jQuery 对象(自我回答)

问题描述 投票:0回答:1

回答我自己的问题,以防其他人遇到这个问题或者我忘记了我做了什么。

在对 CMS 生成的捐赠表单进行自定义运行 Selenium 测试时,我遇到了无法解释的错误。我需要从我的页面获取表单的配置选项。所以我这样做了:

const foo = await driver.executeScript('return Bar.options');

这给了我这些:

  • StaleElementReferenceError:该元素不再附加到 DOM 这一切都很好,只是我从来没有提到过这个元素。
  • JavascriptError:循环对象值 这完全是WTF?

首先解决循环对象问题,我记得页面配置对象包含 jQuery 对象。无论如何,我不能(不想)在我的 Selenium 东西中使用它,所以我这样做了:

const foo = JSON.parse(await driver.executeScript(`return JSON.stringify(Bar.options.theOneIWant, function (key, value) {
                                                                        if (value?.jquery)
                                                                            return {
                                                                                id: value.attr('id'),
                                                                                value: value.val()
                                                                            };
                                                                        else
                                                                            return value;
                                                                    });`));

瞧瞧!我有一组自定义选项,它绕过 jQuery 的东西,同时保留一些值,以防万一我以后需要它们。此外,StaleElementReferenceError 神奇地消失了。我希望这是一个 许多嵌套的 jQuery 对象指向我需要操作的 DOM 的各个位。当 CMS 重写 DOM 时,这些项目会重新生成,因此我不关心测试该特定错误。

更短的答案和更多的工作只是从我的自定义代码中消除 jQuery。管它呢,这让我的生活更轻松。

javascript jquery selenium-webdriver execute-script
1个回答
0
投票

正文中自我回答的问题。但是 TLDR:

const foo = JSON.parse(await driver.executeScript(`return JSON.stringify(Bar.options.theOneIWant, function (key, value) {
                                                                        if (value?.jquery)
                                                                            return {
                                                                                id: value.attr('id'),
                                                                                value: value.val()
                                                                            };
                                                                        else
                                                                            return value;
                                                                    });`));
© www.soinside.com 2019 - 2024. All rights reserved.