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]
uj5u.com熱心網友回復:
只需使用
.//button[@aria-label='Required']
來自元素的 Xpath 需要一個 . 不像其他人。
uj5u.com熱心網友回復:
您可以通過任何常規定位器定位 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"]')
uj5u.com熱心網友回復:
不,css-選擇器不是與shadowroot互動的唯一方式。
您的代碼試驗接近完美,但XPATH運算式不是運算式中的有效 xpath 運算式:
goal = shadow_root.find_element(By.XPATH, '//*/button[@aria-label="Required"]')
在/*并不需要為//button自己看起來整個內的按鈕標簽DOM樹。
所以有效地你的代碼行將是:
goal = shadow_root.find_element(By.XPATH, '//button[@aria-label="Required"]')
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392544.html
上一篇:js:如何簡化html字串
下一篇:使用ajax顯示/隱藏元素
