将对象转换为 WebElement 或 SearchContext JavaScript

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

使用 JavaScript 将对象转换为 WebElement 或 SearchContext 的正确方法是什么?

在Java中,我只需添加“(WebElement)”或“(SearchContext)”就可以成功转换或转换,但是当我使用“as Webelement”或“as SearchContext”在JavaScript中执行相同的步骤时,我得到了一个错误。

Caused by: java.lang.ClassCastException: com.google.common.collect.Maps$TransformedEntriesMap cannot be cast to org.openqa.selenium.SearchContext

这在Shadow Root中也有相关。

Java代码:

webElemHost = browser.findElement(By.xpath("//tagHere[@id='idHere']"));
strCSSSelector = "#idHere";
JavascriptExecutor js = (JavascriptExecutor) browser;
SearchContext shadowRoot = (SearchContext) js.executeScript("return arguments[0].shadowRoot", webElemHost);
WebElement shadowContent = shadowRoot.findElement(By.cssSelector(strCSSSelector));

JavaScript 代码(不起作用):

webElemHost = browser.findElement(By.xpath("//tagHere[@id='idHere']"));
strCSSSelector = "#idHere";
var JavascriptExecutor js = browser as JavascriptExecutor;
var SearchContext shadowRoot = js.executeScript("return arguments[0].shadowRoot", webElemHost) as SearchContext; <== ERROR HERE
var WebElement shadowContent = shadowRoot.findElement(By.cssSelector(strCSSSelector));

请注意,由于 Selenium 版本的限制(仅限 v3),我无法使用 findElement 的 getShadowRoot 函数

javascript selenium-webdriver
1个回答
0
投票

如果您使用的是 JavaScript(而不是 TypeScript),则那里没有强制转换,因此您将走向错误的方向。

取而代之的是,您可以通过在js执行器中调用

querySelector
来获取目标元素实例。

而且,它是 JS,所以会执行元素 getter

async
,所以你应该
await
才能解决
Promise

类似问题参考

Reddit 影子根结构示例:

const url = "https://www.reddit.com/avatar/shop/product/storefront_nft_01HMZYP9FM37N9ZWVD8C1V9RFH";
await driver.get(url);
const shadowHostElement = await driver.findElement(By.tagName('shop-flow-manager'));
let shadowHost = await driver.findElement(By.js("return arguments[0].shadowRoot.querySelector(arguments[1])", shadowHostElement, 'pdp-partial-generator'));
© www.soinside.com 2019 - 2024. All rights reserved.