gpt4 book ai didi

javascript - 在 Firefox 中通过 Selenium 访问 ShadowRoot 返回 JavascriptException : Cyclic object value

转载 作者:行者123 更新时间:2023-12-05 02:42:58 30 4
gpt4 key购买 nike

我正在尝试自动化 www.freeinvaders.org使用 Python 和 Selenium 的 Space Invaders 版本。实际游戏通过 HTML5 canvas 元素运行,该元素包裹在 shadow-root 中。

使用 this question 的答案,我正在尝试展开影子根,这样我就可以单击 Canvas 并“玩”游戏。

我当前的代码:

  def expand_shadow_element(element):
shadowRoot = browser.execute_script('return arguments[0].shadowRoot', element)
return shadowRoot


browser = webdriver.Firefox()
browser.get("http://www.freeinvaders.org/")

#wait for element to load

el = WebDriverWait(browser, timeout=20).until(lambda d:d.find_element_by_tag_name("ruffle-player"))
time.sleep(5)

#expand the shadowroot and click the canvas
host = browser.find_element_by_tag_name("ruffle-player")
shadowRoot = expand_shadow_element(host)
canvas = shadowRoot.find_element_by_tag_name("canvas")
canvas.click()

页面的HTML结构是这样的:(为便于阅读而删节)

<!DOCTYPE html> 
<html lang="en-US">
<head>

<title>Free Invaders</title>

</head>
<body>
<div id='full-page-container'>
<main>
<div id="game-container">

<ruffle-player>
#shadow-root (open)
<div id="container" style="visibility: visible;">

<canvas width="1600" height="760" style="touch-action: none; cursor: auto;"></canvas>
</div><!--container-->
</ruffle-player>
</div><!--game-container-->

</div><!--fullpagecontainer-->
</body>

运行上述 Pyhton 脚本时,在这一行失败:

shadowRoot = browser.execute_script('return arguments[0].shadowRoot', element)

Javascript 错误:

selenium.common.exceptions.JavascriptException: 消息:循环对象值

我知道这个错误应该意味着返回的 JSON 字符串中有一个自引用项,但这里不应该是这种情况。

任何人都可以帮助我解释为什么会出现此错误以及采取什么行动可以缓解这个问题吗?

我使用的是 Python 3.8.5、Selenium 3.141.0 和 Firefox 86.0。所有这些都在 Linux Mint 20.1 上运行。

编辑我也尝试过替代 Javascript:

shadowRoot = browser.execute_script('document.querySelector("ruffle-player").shadowRoot')

但这只会返回另一个错误:

AttributeError: 'NoneType' object has no attribute 'find_element_by_tag_name'

这表明它甚至没有找到任何对象。

最佳答案

这似乎是在 bugzilla 上提交的一个已知问题。

geckodriver 开发者还表示 WebDriver 规范需要更新。参见:w3c/webdriver#350

但是,CAVAh 已经找到并发布了解决此问题的方法 here

按照返回 shadowroot 的子元素的建议 return arguments[0].shadowRoot.children 它找到了 4 个元素:

[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1dd0fedf-1a8c-42f2-a4de-0ed7df478212", element="252a6352-4fe0-409d-a626-18456a973da5")>, 
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1dd0fedf-1a8c-42f2-a4de-0ed7df478212", element="47d76aed-5f44-4933-9718-53267a6417bf")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1dd0fedf-1a8c-42f2-a4de-0ed7df478212", element="d3fcad48-7cbb-4de3-a247-49d7d227e982")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="1dd0fedf-1a8c-42f2-a4de-0ed7df478212", element="abb5012e-79bf-494b-b5f2-ff28dfecab0f")>]

在检查这些之后,看起来第三个元素包含 Canvas 并且可以点击。

下面的代码似乎对我有用:

def expand_shadow_element(element):
# return a list of elements
shadowRoot = browser.execute_script('return arguments[0].shadowRoot.children', element)
return shadowRoot


browser = webdriver.Firefox()
browser.get("http://www.freeinvaders.org/")

#wait for element to load

el = WebDriverWait(browser, timeout=20).until(lambda d:d.find_element_by_tag_name("ruffle-player"))
time.sleep(5)

#expand the shadowroot and click the canvas
host = browser.find_element_by_tag_name("ruffle-player")
shadowRoot = expand_shadow_element(host)

canvas = shadowRoot[2].find_element_by_tag_name("canvas")
canvas.click()

关于javascript - 在 Firefox 中通过 Selenium 访问 ShadowRoot 返回 JavascriptException : Cyclic object value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67133483/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com