Selenium与python在MacOS上使用无头Chrome-耗时太长

Selenium与python在MacOS上使用无头Chrome-耗时太长,selenium,webdriver,selenium-chromedriver,Selenium,Webdriver,Selenium Chromedriver,我有一个脚本,可以登录到一个站点,然后截图。它在MacOS上以无头模式使用Chrome59 我有两个问题,我认为是相关的。一个问题是,我的脚本需要几分钟,而它应该需要几秒钟。第二个是Chrome图标在我的船坞里徘徊,从未关闭过 我认为这些问题是由我正在检查的站点有几个未加载的元素引起的\images\grey\u semi.png和https://www.google-analytics.com/analytics.js我认为这会阻止selenium,并阻止它按照driver.close()的指

我有一个脚本,可以登录到一个站点,然后截图。它在MacOS上以无头模式使用Chrome59

我有两个问题,我认为是相关的。一个问题是,我的脚本需要几分钟,而它应该需要几秒钟。第二个是Chrome图标在我的船坞里徘徊,从未关闭过

我认为这些问题是由我正在检查的站点有几个未加载的元素引起的<代码>\images\grey\u semi.png和
https://www.google-analytics.com/analytics.js
我认为这会阻止selenium,并阻止它按照
driver.close()的指示关闭

我能做什么

脚本:

import os  
from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(executable_path=os.path.abspath("chromedriver"),   chrome_options=chrome_options)
driver.get("https://url.com/")
username = driver.find_element_by_name("L1")
username.clear()
username.send_keys("name")
password = driver.find_element_by_name("P1")
password.clear()
password.send_keys("pass")
driver.find_element_by_id("login").click()
driver.get("https://url.com/Overview.aspx")
driver.get_screenshot_as_file('main-page.png')
driver.close()
我在你的代码中没有看到任何内容。正如您所知,Web应用程序正在使用AJAX技术加载动态数据。当浏览器加载页面时,该页面中的元素可能会以不同的时间间隔加载。根据实施情况,可能会受到
google analytics.com/analytics.js
的影响,因为网页在加载所有内容(包括图像、脚本文件、CSS文件等)后被视为完全加载。默认情况下,UI Selenium测试使用浏览器的新实例,因此它不应该缓存
analytics.js
。需要检查的另一件事是Google Analytics是否放置在特定位置,以便在页面加载或运行异步之前不会加载。它以前在
标记之前,但我相信它现在应该是
标记中的最后一个
。你可以找到更多的细节,他们声称,如果做得好,加载时间很短,甚至不值得担心。我最好的猜测是,问题在于谷歌分析的使用方式

关于你的第二个问题

Chrome图标停留在我的码头上,永远不会关闭

如果您在浏览器控制台中看到错误,请尝试使用该方法,它会关闭浏览器并关闭启动
ChromeDriver
时启动的
ChromeDriver
可执行文件。请记住,
close()
仅用于关闭浏览器,但驱动程序实例仍然悬空。要检查的另一件事是,您实际使用的是
ChromeDriver
可执行文件和chromebrowser的最新版本

更新:

如果等待不影响执行时间,这意味着Selenium将等待页面完成加载,然后查找您指定的元素。我唯一可以考虑的现实选择是:

from selenium.common.exceptions import TimeoutException
try:
    driver.set_page_load_timeout(seconds)
except TimeoutException:
    # put code with waits here
我在你的代码中没有看到任何内容。正如您所知,Web应用程序正在使用AJAX技术加载动态数据。当浏览器加载页面时,该页面中的元素可能会以不同的时间间隔加载。根据实施情况,可能会受到
google analytics.com/analytics.js
的影响,因为网页在加载所有内容(包括图像、脚本文件、CSS文件等)后被视为完全加载。默认情况下,UI Selenium测试使用浏览器的新实例,因此它不应该缓存
analytics.js
。需要检查的另一件事是Google Analytics是否放置在特定位置,以便在页面加载或运行异步之前不会加载。它以前在
标记之前,但我相信它现在应该是
标记中的最后一个
。你可以找到更多的细节,他们声称,如果做得好,加载时间很短,甚至不值得担心。我最好的猜测是,问题在于谷歌分析的使用方式

关于你的第二个问题

Chrome图标停留在我的码头上,永远不会关闭

如果您在浏览器控制台中看到错误,请尝试使用该方法,它会关闭浏览器并关闭启动
ChromeDriver
时启动的
ChromeDriver
可执行文件。请记住,
close()
仅用于关闭浏览器,但驱动程序实例仍然悬空。要检查的另一件事是,您实际使用的是
ChromeDriver
可执行文件和chromebrowser的最新版本

更新:

如果等待不影响执行时间,这意味着Selenium将等待页面完成加载,然后查找您指定的元素。我唯一可以考虑的现实选择是:

from selenium.common.exceptions import TimeoutException
try:
    driver.set_page_load_timeout(seconds)
except TimeoutException:
    # put code with waits here

我用以下方法解决了这个问题:

driver.find_element_by_link_text("Job Board").click()
driver.find_element_by_link_text("Available Deployments").click()

我用以下方法解决了这个问题:

driver.find_element_by_link_text("Job Board").click()
driver.find_element_by_link_text("Available Deployments").click()

谢谢你的回复
driver.quit()
对我来说已经足够好了。感谢您的延迟,我已经尝试了
驱动程序。隐式地等待(10)
,但效果相同。你能告诉我,为了“等待10秒,然后点击该死的按钮”,我应该使用什么样的等待方式吗?作为参考,谷歌分析脚本位于顶部,显示为
(函数(I,s,o,g,r,a,m){I['GoogleAnalyticsObject']=r;I[r]=I[r]| function(){(I[r].q=I[r].q||[])。推送(参数)},I[r].l=1*新日期();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(窗口、文档、“脚本”和https://www.google-analytics.com/analytics.js","ga",;ga(“创建”、“UA-96380300-1”、“自动”);ga(‘发送’、‘页面浏览’)
定义和使用google analytics几乎总是更好的-如果你可以更改页面代码,根据他们的建议将其作为最后一个
包含在
中。我尝试了两个建议的显式等待功能,但仍然需要大约4分钟。我无法控制页面移动谷歌分析。谢谢你的回复
driver.quit()
对我来说已经足够好了。感谢您的延迟,我已经尝试了
驱动程序。隐式地等待(10)
,但效果相同。你能告诉我,为了“等10秒,然后点击该死的按钮”,我应该使用什么样的等待方式吗