无法在带有无头 chrome 的网页上定位元素

Kub*_*ski 7 python selenium google-chrome selenium-chromedriver google-chrome-headless

我有一个访问打印机的脚本,当 chrome 正常运行时,我的代码完全正常,但是当它无头运行时,selenium 似乎无法在网页上找到元素。

这是相关的代码:

初始化方法:

def __init__(self, ip_address):
    """ Initialize a new Printer_Webpage object."""
    self.ip_address = ip_address
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--window-size=1920x1080")
    self.browser = webdriver.Chrome(chrome_options=chrome_options)
    # Ignore lack of cert for each printer web page.
    # Otherwise, can't open page.
    self.browser.accept_untrusted_certs = True
Run Code Online (Sandbox Code Playgroud)

登录方式:

def login(self):
    """Navigates through the login page for the printer."""
    # Open login page
    self.browser.get(f'https://{self.ip_address}/wcd/top.xml')
    # STEPS TO LOGIN:
    # 1) Select 'Administrator' radio button and click.
    self.browser.find_element_by_id('Admin').click()
    # 2) Select Login button and click.
    self.browser.find_element_by_xpath("//input[@type='submit' \
                                        and @value='Login']").click()
    # 3) Select admin (user mode)
    self.browser.find_element_by_id('R_ADM2').click()
    # 4) Select password field and input PASSWORD, then submit.
    password_field = self.browser.find_element_by_id('Admin_Pass')
    password_field.send_keys(PASSWORD)
    password_field.send_keys(Keys.RETURN)
Run Code Online (Sandbox Code Playgroud)

完整的错误信息:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"Admin"}
Run Code Online (Sandbox Code Playgroud)

以下是一些可能有用的其他信息:

(Session info: headless chrome=62.0.3202.94)

(Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.14393 x86_64)
Run Code Online (Sandbox Code Playgroud)

Raj*_*gam 9

我有同样的问题。您可以截取屏幕截图以了解问题所在。

driver.get_screenshot_as_file("screenshot.png")
Run Code Online (Sandbox Code Playgroud)

硒在正常运行时工作但在无头模式下停止工作的几个原因 -

1)它可能已切换到移动模板。可以通过改变窗口大小来修复。

chrome_options.add_argument("--window-size=1920,1080")
Run Code Online (Sandbox Code Playgroud)

2)如果是空白页(截图),可能是由于 SSL 证书无效。(见@Marcel_Wilson 帖子)应该通过以下方式修复 -

chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--allow-running-insecure-content')
Run Code Online (Sandbox Code Playgroud)

3)网站可能阻止了“无头”模式。(您的屏幕截图可能会显示您无法在正常模式下重新创建的错误)您可以试试这个-

user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36'
options.add_argument(f'user-agent={user_agent}')
Run Code Online (Sandbox Code Playgroud)

但是,如果网站具有更强大的阻止方法,则上述代码将不起作用。您可以在https://intoli.com/blog/making-chrome-headless-undetectable/找到更多相关信息。

  • Raj 对我来说是第 3 点,我在这里发布了更深入的答案,因为还有其他事情需要注意,因为对阻止无头进行一些更改的网站在早期版本的 Chrome 中也无法正常工作:https:// /stackoverflow.com/a/69464060/1871891 (2认同)

小智 7

我遇到了同样的情况。学习后,下列说法正确吗?

self.chrome_options = webdriver.ChromeOptions()
self.chrome_options.add_argument("--window-size=1920,1080")
self.chrome_options.add_argument("--disable-extensions")
self.chrome_options.add_argument("--proxy-server='direct://'")
self.chrome_options.add_argument("--proxy-bypass-list=*")
self.chrome_options.add_argument("--start-maximized")
self.chrome_options.add_argument('--headless')
self.chrome_options.add_argument('--disable-gpu')
self.chrome_options.add_argument('--disable-dev-shm-usage')
self.chrome_options.add_argument('--no-sandbox')
self.chrome_options.add_argument('--ignore-certificate-errors')
self.browser = webdriver.Chrome(options=self.chrome_options)
Run Code Online (Sandbox Code Playgroud)


bro*_*ess 6

如果是 SSL 证书的问题,您可以使用命令行标志在没有证书的情况下启动 Chrome(假设您就是这样启动的)。我相信这个开关是,并且我从这里--allow-running-insecure-content找到的列表中找到了它。