我有一个登录网站的脚本,然后截取屏幕截图。它在无头模式下使用MacOS上的Chrome 59。
我有两个问题,我认为是相关的。一个问题是我的脚本需要几分钟才需要几秒钟。第二个是Chrome图标在我的Dock中徘徊,从不关闭。
我认为这些问题是由我正在检查的网站引起的,有几个元素无法加载。 \images\grey_semi.png
和https://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()
答案 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()