我的环境:
- 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()