如何使用 Selenium 和 Python 在网站 https://www.virustotal.com 的 shadow-root(打开)中找到名字字段
How to locate the First name field within shadow-root (open) within the website https://www.virustotal.com using Selenium and Python
我正在尝试在 python 中使用 selenium 自动执行在病毒总站点上注册的过程。但是在通过 id 获取元素时遇到问题。我被困在这任何帮助将不胜感激谢谢。
这是我正在尝试的代码。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver =webdriver.Chrome()
driver.get('https://www.virustotal.com/gui/join-us')
print(driver.title)
search = driver.find_element_by_id("first_name")
search.send_keys("Muhammad Aamir")
search.send_keys(Keys.RETURN)
time.sleep(5)
driver.quit()
如果您查看网站的 HTML,您可以看到您的输入字段位于所谓的 #shadowroot
.
中
这些 shadowroot 会阻止您使用简单的 find_element_by_id
找到包含在 shadowroot 中的元素。您可以通过查找包含您要查找的元素的所有父 shadowroot 来解决此问题。在每个 shadowroot 中,您将需要使用 javascript 的 querySelector 并找到下一个 shadowroot,直到您可以访问您正在寻找的元素。
在您的情况下,您需要执行以下操作:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver =webdriver.Chrome()
driver.get('https://www.virustotal.com/gui/join-us')
print(driver.title)
# wait a bit untill form pops up
time.sleep(3)
# Retrieve the last shadowroot using javascript
javascript = """return document
.querySelector('vt-virustotal-app').shadowRoot
.querySelector('join-us-view').shadowRoot
.querySelector('vt-ui-text-input').shadowRoot"""
shadow_root = driver.execute_script(javascript)
# Find the input box
search = shadow_root.find_element_by_id("input")
search.send_keys("Muhammad Aamir")
search.send_keys(Keys.RETURN)
time.sleep(5)
driver.quit()
网站 https://www.virustotal.com/gui/join-us 中的 名字 字段位于多个 #shadow-root (open)
.[= 的深处18=]
解决方案
要将字符序列发送到名字字段,您必须使用 and you can use the following :
代码块:
from selenium import webdriver
import time
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.get("https://www.virustotal.com/gui/join-us")
time.sleep(7)
first_name = driver.execute_script("return document.querySelector('vt-virustotal-app').shadowRoot.querySelector('join-us-view.iron-selected').shadowRoot.querySelector('vt-ui-two-column-hero-layout').querySelector('vt-ui-text-input#first_name').shadowRoot.querySelector('input#input')")
first_name.send_keys("Muhammad Aamir")
浏览器快照:
参考资料
您可以在以下位置找到一些相关讨论:
我正在尝试在 python 中使用 selenium 自动执行在病毒总站点上注册的过程。但是在通过 id 获取元素时遇到问题。我被困在这任何帮助将不胜感激谢谢。 这是我正在尝试的代码。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver =webdriver.Chrome()
driver.get('https://www.virustotal.com/gui/join-us')
print(driver.title)
search = driver.find_element_by_id("first_name")
search.send_keys("Muhammad Aamir")
search.send_keys(Keys.RETURN)
time.sleep(5)
driver.quit()
如果您查看网站的 HTML,您可以看到您的输入字段位于所谓的 #shadowroot
.
这些 shadowroot 会阻止您使用简单的 find_element_by_id
找到包含在 shadowroot 中的元素。您可以通过查找包含您要查找的元素的所有父 shadowroot 来解决此问题。在每个 shadowroot 中,您将需要使用 javascript 的 querySelector 并找到下一个 shadowroot,直到您可以访问您正在寻找的元素。
在您的情况下,您需要执行以下操作:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver =webdriver.Chrome()
driver.get('https://www.virustotal.com/gui/join-us')
print(driver.title)
# wait a bit untill form pops up
time.sleep(3)
# Retrieve the last shadowroot using javascript
javascript = """return document
.querySelector('vt-virustotal-app').shadowRoot
.querySelector('join-us-view').shadowRoot
.querySelector('vt-ui-text-input').shadowRoot"""
shadow_root = driver.execute_script(javascript)
# Find the input box
search = shadow_root.find_element_by_id("input")
search.send_keys("Muhammad Aamir")
search.send_keys(Keys.RETURN)
time.sleep(5)
driver.quit()
网站 https://www.virustotal.com/gui/join-us 中的 名字 字段位于多个 #shadow-root (open)
.[= 的深处18=]
解决方案
要将字符序列发送到名字字段,您必须使用
代码块:
from selenium import webdriver import time options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe') driver.get("https://www.virustotal.com/gui/join-us") time.sleep(7) first_name = driver.execute_script("return document.querySelector('vt-virustotal-app').shadowRoot.querySelector('join-us-view.iron-selected').shadowRoot.querySelector('vt-ui-two-column-hero-layout').querySelector('vt-ui-text-input#first_name').shadowRoot.querySelector('input#input')") first_name.send_keys("Muhammad Aamir")
浏览器快照:
参考资料
您可以在以下位置找到一些相关讨论: