Wie klicke ich auf diese Elemente mit Python und Selenium?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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.

GeldGeil457 
Fragesteller
 05.12.2023, 21:18

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()"

0
regex9  06.12.2023, 18:24
@GeldGeil457

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).

1