CUI环境下Selenium+chrome最新headless特性的问题

我的环境:

  • Docker jessie
  • Python 3.4
  • Selenium 3
  • Chrome59
  • chrome webdriver 2.30

官方推荐的使用方法:https://intoli.com/blog/running-selenium-with-headless-chrome/

我的参数是:

options = webdriver.ChromeOptions()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--window-size=1200x600')

执行官方示例时出现下面的错误:

selenium.common.exceptions.WebDriverException: Message: unknown error: an X display is required for keycode conversions, consider using Xvfb
  (Session info: headless chrome=59.0.3071.86)
  (Driver info: chromedriver=2.30.(8a88bbe0775e2a23afda0ceaf2ef7ee74e822cc5),platform=Linux 4.4.0-49-generic x86_64)

chrome headless时刚更新的特性,搜索到的文章大多都是用的xvfb,只找到一位日本同学绕开了这个问题。其实google官方就有专门说selenimu还不能很好的支持新的headless,实际使用时主要在sendkeys时出错,日本同学用js绕过了这个错误。方法如下:

# driver.get_element_by_css_selector('hoge').sendKeys('fuga') は例外が発生
def _set_value_for_element(selector: str, value: str):
        return 'document.querySelector("{selector}").setAttribute("value", "{value}")'.format(selector=selector, value=value)

driver.get(url)
# sendKeys() を実行すると例外が発生するので、JSを実行する
driver.execute_script(_set_value_for_element(user_name_selector, user_name))
driver.execute_script(_set_value_for_element(user_password_selector, user_password))
driver.find_element_by_css_selector(login_button_selector).click()