如何在网站的shadowroot(open)中找到First name字段https://www.virustotal.com 使用Selenium和Python

2024-04-26 13:13:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在virus total站点上自动注册,并为此在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()

Tags: fromimportsendid元素searchtime站点
2条回答

网站https://www.virustotal.com/gui/join-us中的名字字段位于多个#shadow-root (open)的深处

virustotal_firstname


解决方案

要将字符序列发送到名字字段,必须使用^{},并且可以使用以下Locator Strategy

  • 代码块:

    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")
    
  • 浏览器快照:

virustotal_firstname_filled


参考资料

您可以在以下内容中找到一些相关讨论:

如果您查看网站的HTML,您可以看到您的输入字段位于所谓的#shadowroot

enter image description here

这些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()

相关问题 更多 >