Cách đọc văn bản trong # shadow-root (user-agent)

Sep 17 2020

Tôi đang sử dụng Selenium (Python) để tự động hóa một trang web. Tôi đang cố lấy văn bản từ trường nhập trong # shadow-root (user-agent). Xpath tôi đã sử dụng:

driver.find_element_by_xpath("**//*/p-calendar/span/input**").text

không trả lại bất cứ thứ gì. Đính kèm ảnh chụp màn hình phần tử DOM của tôi. Yêu cầu: Để lấy văn bản từ gốc bóng tối: 01:01

Trả lời

1 DebanjanB Sep 17 2020 at 03:43

Theo nhận xét@hayatoito của (người tạo Shadow DOM) :

Động lực ban đầu của việc giới thiệu một cây bóng kín là "Never allow an access to a node in a closed shadow tree, via any APIs, from outside"AFAIK. Như vậy, chúng ta không thể truy cập vào một nút trong cây bóng ẩn bên trong được sử dụng trong <video>phần tử, trong Blink.

Trên thực tế, tôi đã thiết kế một cây bóng kín theo cách như vậy. Nếu có một cách nào đó để truy cập vào một nút trong một cây bóng kín, nó nên được coi là một lỗi của thông số kỹ thuật.

Tôi nghĩ rằng hoàn toàn ổn khi có API để cho phép truy cập trong lớp ứng dụng hoặc tiện ích mở rộng của Chrome. Tuy nhiên, đối với một ứng dụng web bình thường, tôi nghĩ rằng thỏa thuận hiện tại là như vậy "Never allow it".

Nếu chúng tôi cho phép, điều đó có nghĩa là chúng tôi không cần một cây bóng kín. Tôi nghĩ chỉ cần có một bóng cây thông thoáng là đủ.

Furhter @Supersharptrong bình luận của anh ấy bên dưới câu trả lời của riêng anh ấy trong cuộc thảo luận Làm thế nào để lấy phần tử trong gốc tác nhân người dùng với JavaScript? đề cập:

#shadow-root (user-agent)là triển khai gốc của nhà cung cấp trình duyệt nên chúng không được ghi lại và sẽ không bao giờ có thể truy cập được. Chỉ có Shadow DOM mở là, theo thông số kỹ thuật


Phối cảnh WebDriver

Gần đây, @AutomatedTester [David Burns, Giám đốc Bacon, Mozilla Corporation] đã khởi xướng một cuộc thảo luận về WebDriver - Khả năng kiểm tra của các thành phần web

  • Yêu cầu
  • Đề xuất
  • Người tìm bệnh

Hiện tại Selenium Team đang mở để chấp nhận các yêu cầu kéo giống nhau.


Tài liệu tham khảo

Bạn có thể tìm thấy một số cuộc thảo luận chi tiết có liên quan trong:

  • Cần trợ giúp để nhấp vào phần tử dưới bóng Loại gốc (đóng)

Outro

Tại đây, bạn có thể tìm thấy một cuộc thảo luận có liên quan về Cách tự động hóa các phần tử DOM bóng bằng cách sử dụng selen?

AlvinOgwu Sep 17 2020 at 00:42

Bạn có thể sử dụng driver.execute_scriptđể chèn mã JavaScript trả về ShadowRoot sau đó sử dụng find_elementđể lấy phần tử con của gốc bóng mà bạn đang tìm kiếm.

input_shadow = driver.execute_script('''return document.querySelector("$1").shadowRoot''')
div_text = inputShadow.find_element_by_tag_name("div").text

$ 1 - Your element's identifier or selector.

Nếu bạn muốn sử dụng xpath để tìm các phần tử

input_shadow = driver.execute_script('''return $x(\"//*/p-calendar/span/input\")[0]''')
div_text = inputShadow.find_element_by_tag_name("div").text