CssSelector 是我可以用于 shadowroot 的唯一方法吗? selenium.common.exceptions.InvalidArgumentException:消息:无效参数:无效

Posted

技术标签:

【中文标题】CssSelector 是我可以用于 shadowroot 的唯一方法吗? selenium.common.exceptions.InvalidArgumentException:消息:无效参数:无效定位器【英文标题】:Is CssSelector the only way I can use for shadowroot? selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid locator 【发布时间】:2022-01-24 03:15:18 【问题描述】:

CSS_SELECTOR 是我可以用来在 shadowroot 元素中查找元素的唯一方法吗? 我正在使用 Python 3.10.1、Selenium (4.1.0) chrome(96.0.4664.110)。

下面是我的代码

host = browser.find_element(By.ID, 'someid') 
shadow_root = browser.execute_script('return arguments[0].shadowRoot', host)
goal = shadow_root.find_element(By.XPATH, '//*/button[@aria-label="Required"]')

如果我不使用By.CSS_SELECTOR,我得到的错误如下。

Traceback (most recent call last):
  File "C:\Files\Workspace\PostInstallVerify.py", line 787, in <module>
    maxlenInput = getShadowElement(maxlenid, ".rwa-input")
  File "C:\Files\Workspace\PostInstallVerify.py", line 272, in getShadowElement
    goal = shadow_root.find_element(By.XPATH, '//*/button[@aria-label="Required"]')
  File "C:\Users\Tomas.Tang\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\shadowroot.py", line 45, in find_element
    return self._execute(Command.FIND_ELEMENT_FROM_SHADOW_ROOT, "using": using, "value": value)['value']
  File "C:\Users\Tomas.Tang\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\shadowroot.py", line 64, in _execute
    return self.session.execute(command, params)
  File "C:\Users\Tomas.Tang\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Tomas.Tang\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid locator
  (Session info: chrome=96.0.4664.110)
Stacktrace:
Backtrace:
    Ordinal0 [0x00326903+2517251]
    Ordinal0 [0x002BF8E1+2095329]
    Ordinal0 [0x001C2848+1058888]
    Ordinal0 [0x001ED5C4+1234372]
    Ordinal0 [0x001ED68B+1234571]
    Ordinal0 [0x001E3AE1+1194721]
    Ordinal0 [0x0020650A+1336586]
    Ordinal0 [0x001E3A36+1194550]
    Ordinal0 [0x002065BA+1336762]
    Ordinal0 [0x00215BBF+1399743]
    Ordinal0 [0x0020639B+1336219]
    Ordinal0 [0x001E27A7+1189799]
    Ordinal0 [0x001E3609+1193481]
    GetHandleVerifier [0x004B5904+1577972]
    GetHandleVerifier [0x00560B97+2279047]
    GetHandleVerifier [0x003B6D09+534521]
    GetHandleVerifier [0x003B5DB9+530601]
    Ordinal0 [0x002C4FF9+2117625]
    Ordinal0 [0x002C98A8+2136232]
    Ordinal0 [0x002C99E2+2136546]
    Ordinal0 [0x002D3541+2176321]
    BaseThreadInitThunk [0x766CFA29+25]
    RtlGetAppContainerNamedObjectPath [0x773A7A9E+286]
    RtlGetAppContainerNamedObjectPath [0x773A7A6E+238]
    (No symbol) [0x00000000]

【问题讨论】:

从一个元素进行 Xpathing 需要一个 .在它前面是 .// 所以你可以在 shadow root 之后使用任何选择器。 这不是由于我编写 XPATH 的语法,因为 XPATH 如果不在 ShadowRoot 内也可以正常工作。我刚刚发现了一个有趣的链接,它说可能是 chromedriver 的限制。明天将再次与firefox一起验证是否属实。 github.com/SeleniumHQ/selenium/issues/… 【参考方案1】:

简单使用

 .//button[@aria-label='Required']

来自元素的 Xpath 需要一个 .不像其他人。

【讨论】:

试过了,不行。【参考方案2】:

您可以通过任何常规定位器在 shadow DOM 中定位元素:CSS_SELECTOR、XPATH、ID、CLASS_NAME 等。 在这里,您尝试使用无效的 XPath 表达式。

'//*/button[@aria-label="Required"]'

不是有效的 XPath 表达式。 我不知道您正在处理哪个页面以及该元素的正确定位器是什么,但这至少是一个正确的 XPath 表达式,可能对您来说是正确的:

'//button[@aria-label="Required"]'

所以不是

goal = shadow_root.find_element(By.XPATH, '//*/button[@aria-label="Required"]')

试试这个:

goal = shadow_root.find_element(By.XPATH, '//button[@aria-label="Required"]')

或许

goal = shadow_root.find_element(By.XPATH, './/button[@aria-label="Required"]')

【讨论】:

我已经测试了你的建议,但同样的错误是“无效定位器”。这不是由于我编写 XPATH 的语法,因为 XPATH 如果不在 ShadowRoot 内,也可以正常工作。我刚刚发现了一个有趣的链接,它说可能是 chromedriver 的限制。明天将再次与firefox一起验证是否属实。 github.com/SeleniumHQ/selenium/issues/…【参考方案3】:

,css-selectors 不是与 shadowroot 交互的唯一方式。

您的代码试验接近完美,但 XPATH 表达式不是表达式中的有效 xpath 表达式:

goal = shadow_root.find_element(By.XPATH, '//*/button[@aria-label="Required"]')

不需要/*,因为//button 本身会在整个DOM Tree 中查找按钮标签。

因此,您的代码行将是:

goal = shadow_root.find_element(By.XPATH, '//button[@aria-label="Required"]')

【讨论】:

这不是因为我编写 XPATH 的语法,因为如果不在 ShadowRoot 内,XPATH 也可以正常工作。我刚刚发现了一个有趣的链接,它说可能是 chromedriver 的限制。明天将再次与firefox一起验证是否属实。 github.com/SeleniumHQ/selenium/issues/…

以上是关于CssSelector 是我可以用于 shadowroot 的唯一方法吗? selenium.common.exceptions.InvalidArgumentException:消息:无效参数:无效的主要内容,如果未能解决你的问题,请参考以下文章

cssSelector 的 Selenium WebDriver 问题

用于硒的 cssSelector 与 XPath

html 中没有 id、xpath、classnmae、teg、link、cssselector、name 可用于 selenium 对象识别 java

filter: drop-shadow和box-shadow, 用于CSS设计漂亮的阴影

Firefox:shadow-DOM 兼容性

Css文字特效之text-shadow特效