我使用Selenium开发了一些Python脚本,最初是PhantomJS。在进入自动下载的过程中,我切换到(朝向)Firefox(有效),然后使用无头选项切换Chrome,因此我不会在我面前打开浏览器。
我的第一个访问网页和几个HTML元素的脚本与无头Chrome完美配合。
然而,第二个仅适用于Chrome标题。如果我添加“无头”选项,它将不再起作用。当我尝试在无头模式下打印HTML以查看为什么它找不到我正在寻找的HTML元素时,我只有:
<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
使用标题Chrome,我打印完整的HTML。 这就是我开始无头Chrome的方式:
options = webdriver.ChromeOptions()
options.add_argument("--ignore-certificate-errors")
options.add_argument("headless")
driver = webdriver.Chrome(chrome_options=options)
再次注意,这适用于我的另一个脚本。这里唯一的区别是我需要登录才能访问该页面,但即便如此,为什么它会与头部一起工作?我的脚本无论如何都会通过填写表单自动登录。
Python:3.6.1,Chrome:60.0.3112.78(64位),Selenium:3.4.3
有什么想法吗? 感谢。
编辑:这是代码的开头
url = 'https://10.11.227.21/tmui/'
driver.get(url + "login.jsp")
html_source = driver.page_source
print(html_source)
blocStatus = WebDriverWait(driver, TIMEOUT).until(EC.presence_of_element_located((By.ID, "username")))
inputElement = driver.find_element_by_id("username")
inputElement.send_keys('actualLogin')
inputElement = driver.find_element_by_id("passwd")
inputElement.send_keys('actualPassword')
inputElement.submit()
答案 0 :(得分:5)
我有和你一样的经历,并使用xvfb和pyvirtualdisplay解决了这个问题。
我使用chromedrive = v2.3.1,chrome-browser = v60和Selenium = 3.4.3
在Headless chrome中,一些脚本似乎没有按预期工作。
请参阅https://gist.github.com/addyosmani/5336747中的vpassapera评论。
如下所示尝试,
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
# Do Not use headless chrome option
# options.add_argument('headless')
url = 'https://10.11.227.21/tmui/'
driver.get(url + "login.jsp")
html_source = driver.page_source
print(html_source)
blocStatus = WebDriverWait(driver, TIMEOUT).until(EC.presence_of_element_located((By.ID, "username")))
inputElement = driver.find_element_by_id("username")
inputElement.send_keys('actualLogin')
inputElement = driver.find_element_by_id("passwd")
inputElement.send_keys('actualPassword')
inputElement.submit()
display.stop()
xvfb需要使用“pyvortualdisplay”
$ sudo apt-get install -y xvfb
答案 1 :(得分:3)
无头Chrome不支持不安全的证书,因此具有不安全证书的网站不会将其空白打开。您需要添加功能,如下所示:
from selenium import webdriver
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptSslCerts'] = True
capabilities['acceptInsecureCerts'] = True
driver = webdriver.Chrome(chrome_options = chrome_options,executable_path='your path',desired_capabilities=capabilities)
driver.get("yourWebsite")
这将完成工作。
答案 2 :(得分:1)
无头镀铬在同一台机器上可能比头部更快,尝试在找到密码元素之前添加一些等待。
答案 3 :(得分:1)
我遇到了同样的问题,并在conftest.py中设置窗口大小解决了它。 我的代码段:
@pytest.fixture
def chrome_options(chrome_options, pytestconfig):
if pytestconfig.getoption('headless'):
chrome_options.add_argument('--headless')
chrome_options.add_argument("window-size=1920,1080")
else:
chrome_options.add_argument("start-maximized");
return chrome_options
答案 4 :(得分:0)
如果您删除以下内容,则可以使用。
driver.fullscreen_window()
答案 5 :(得分:0)
推荐https://github.com/SeleniumHQ/selenium/issues/4477 添加以下代码
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)