使用 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(而不是 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'));