Wie klicke ich auf diese Elemente mit Python und Selenium?
Hallo,
Ich versuche, auf die folgenden Elemente auf dieser Webseite (https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx) mit Python und Selenium zu klicken.
//*[@id=“tone-options”]/li[3]/button
//*[@id=“camera-container”]/button
//*[@id=“camera-container”]/cib-flyout/cib-visual-search//div[3]/button[1]
Ich habe XPATH, CSS probiert.
Fehler:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="tone-options"]/li[3]/button"}
(Session info: chrome=119.0.6045.200)
Stacktrace:
GetHandleVerifier [0x00007FF7D97B82B2+55298]
(No symbol) [0x00007FF7D9725E02]
(No symbol) [0x00007FF7D95E05AB]
(No symbol) [0x00007FF7D962175C]
(No symbol) [0x00007FF7D96218DC]
(No symbol) [0x00007FF7D965CBC7]
(No symbol) [0x00007FF7D96420EF]
(No symbol) [0x00007FF7D965AAA4]
(No symbol) [0x00007FF7D9641E83]
(No symbol) [0x00007FF7D961670A]
(No symbol) [0x00007FF7D9617964]
GetHandleVerifier [0x00007FF7D9B30AAB+3694587]
GetHandleVerifier [0x00007FF7D9B8728E+4048862]
GetHandleVerifier [0x00007FF7D9B7F173+4015811]
GetHandleVerifier [0x00007FF7D98547D6+695590]
(No symbol) [0x00007FF7D9730CE8]
(No symbol) [0x00007FF7D972CF34]
(No symbol) [0x00007FF7D972D062]
(No symbol) [0x00007FF7D971D3A3]
BaseThreadInitThunk [0x00007FF8125E7344+20]
RtlUserThreadStart [0x00007FF8130026B1+33]
kann mir jemand helfen? Danke.
1 Antwort
Die Elemente befinden sich innerhalb von Shadow Roots. Du musst erst die Hosts finden, um anschließend den integrierten DOM auflösen zu können.
Beispiel:
Das .camera-container-Element steckt verschachtelt in den Roots der Container (Hosts) cib-serp und cib-action-bar. Erst muss der Shadow Tree für den ersten Container aufgelöst werden, über diesen anschließend der Zweite. Im innersten Kontext kann das eigentliche Element gesucht werden.
cib_serp = browser.find_element(By.CSS_SELECTOR, ".cib-serp-main")
cib_serp_shadow_root = driver.execute_script("return arguments[0].shadowRoot", cib_serp)
cib_action_bar = cib_serp_shadow_root.find_element(By.CSS_SELECTOR, "#cib-action-bar-main")
cib_action_bar_shadow_root = driver.execute_script("return arguments[0].shadowRoot", cib_action_bar)
camera_container = cib_action_bar_shadow_root.find_element(By.CSS_SELECTOR, ".camera-container")
Schau für die anderen Elemente in den Browserinspektor und verfolge die Elternkette, um herauszufinden, in welchen Shadow Roots sie liegen.
Statt driver, muss cib_conversation_shadow_root für den Aufruf von find_element verwendet werden.
cib_welcome_container = cib_conversation_shadow_root.find_element(By.CSS_SELECTOR, '#cib-chat-main > cib-welcome-container')
Auch bei der Definition von cib_tone nutzt du das falsche Objekt. In diesem Fall müsste es das cib_welcome_container_shadow_root-Objekt sein. Der CSS-Selektor für cib_tone wäre cib-tone-selector (Elementselektor, also ohne Raute, denn das Element hat keine ID).
Beim Bild hinzufügen anklicken hats geklappt aber beim Unterhaltungsstil umstellen auf genau scheitert es beim finden von "<cib-welcome-container product="bing" chat-type="consumer"></cib-welcome-container>" mein code: "cib_serp = driver.find_element(By.CSS_SELECTOR, ".cib-serp-main")
cib_serp_shadow_root = driver.execute_script("return arguments[0].shadowRoot", cib_serp)
cib_conversation = cib_serp_shadow_root.find_element(By.CSS_SELECTOR, '#cib-conversation-main')
cib_conversation_shadow_root = driver.execute_script("return arguments[0].shadowRoot", cib_conversation)
cib_welcome_container = driver.find_element(By.CSS_SELECTOR, '#cib-chat-main > cib-welcome-container')
cib_welcome_container_shadow_root = driver.execute_script("return arguments[0].shadowRoot", cib_welcome_container)
cib_tone = driver.find_element(By.CSS_SELECTOR, '#cib-tone-selector')
cib_tone_shadow_root = driver.execute_script("return arguments[0].shadowRoot", cib_tone)
genau = cib_tone_shadow_root.find_element(By.XPATH, '//*[@id="tone-options"]/li[3]/button')
genau.click()"