硒与python在MacOS上使用无头Chrome - 需要太长时间

时间:2017-06-26 02:31:40

标签: selenium webdriver selenium-chromedriver

我有一个登录网站的脚本,然后截取屏幕截图。它在无头模式下使用MacOS上的Chrome 59。

我有两个问题,我认为是相关的。一个问题是我的脚本需要几分钟才需要几秒钟。第二个是Chrome图标在我的Dock中徘徊,从不关闭。

我认为这些问题是由我正在检查的网站引起的,有几个元素无法加载。 \images\grey_semi.pnghttps://www.google-analytics.com/analytics.js,我认为这可以阻止硒,并按照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()

2 个答案:

答案 0 :(得分:2)

我的代码中没有看到任何waits。如您所知,Web应用程序正在使用AJAX技术来加载动态数据。当浏览器加载页面时,该页面中的元素可能以不同的时间间隔加载。根据实现情况,load event可能会受google-analytics.com/analytics.js影响,因为在加载所有内容(包括图像,脚本文件,CSS文件等)后,网页被视为已完全加载。默认情况下,您的UI Selenium测试使用浏览器的新实例,因此它不应该缓存analytics.js。还有一件事要检查,是否将Google Analytics放置在特定位置,以便在页面加载或运行异步之前不加载它。它曾经在</body>标记之前,但我相信它现在应该是<script>标记中的最后一个<head>。你可以找到Page Load Impact of Google Analytics here的更多细节,他们声称如果做得对,加载时间太短,甚至不值得担心。我最好的猜测是问题在于如何使用Google Analytics。

关于你的第二个问题

  

Chrome图标在我的Dock中徘徊,永不关闭

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

更新:

如果等待不影响您的执行时间,这意味着Selenium将等待页面完成加载,然后查找您指定的元素。我能想到的唯一真正的选择是specify a page timeout这样:

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

答案 1 :(得分:0)

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

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