一、需求描述
由于selenium自动化脚本被设置了定时任务每天会定时执行,脚本是有头模式的浏览器,即执行脚本时会打开浏览器,并且脚本是实现的是自动截图的一些功能,这就很不方便,比如在做其他事情,突然打开浏览器来截图会打断当前的事情并且可能会截到非访问页面的内容,这样自动发出去会产生不好的影响,因此为了避免以上两个问题,考虑使用无头模式,即执行脚本不打开浏览器,在后台实现一些操作,这样就方便多了。
二、实现过程
1、首先定义初始化了无头浏览器,代码如下
from selenium import webdriver from selenium.webdriver.chrome.options import Options import pyautogui import time # 无头模式初始化 def noheadmodel(): webdriver_path = '/Users/xxx/Documents/python/pack/chromedriver/chromedriver' page_url = 'https://www.tapd.cn/xxx' chrome_options = Options() # 设置为无头模式 chrome_options.add_argument('--headless') width,height = pyautogui.size() chrome_options.add_argument('--window-size=%sx%s' % (width,height)) driver = webdriver.Chrome(executable_path=webdriver_path,chrome_options=chrome_options) driver.get(page_url) time.sleep(1) driver.get_screenshot_as_file('test.png') return driver,page_url
2、调用初始化函数使用无头模式执行脚本,代码如下
3、执行脚本
执行脚本出现如下图报错,并且没有成功截图,报错如下图
4、通过调试代码发现是执行js时报错了,如下
page_height = self.driver.execute_script('return ' + self.js + 'Height')
三、报错原因查找
上述脚本执行失败后开始查找猜想各种报错原因
1、猜想一
难道无头模式浏览器没有scrollHeight参数?
验证:
(1)去网上首先百度是不是有无头模式浏览器没有scrollHeight参数这个说法,发现没有这样的文章。
(2)使用百度网页执行js脚本发现可以正常获取scrollHeight没有报错。
因此猜想一可以排除。
2、猜想二
是不是中间没有设置等待时间,导致页面还没加载出来,所以无法通过scrollHeight获取页面高度?
验证:
(1)在初始化浏览器的时候又设置了等待时间,即time.sleep(1),验证问题没解决。
因此猜想二也排除。
3、猜想三
难道是访问被禁止,页面没打开?
验证:
(1)在无头模式下执行脚本,打开浏览器的时候使用函数driver.get_screenshot_as_file()保存截图,发现截到的图确实出现访问被拒绝的提示,页面没法开,如下图:
问题终于找到了,就是被拒绝访问导致页面没打开无法获取网页高度,接下来又是艰难的解决无头浏览器被觉得访问的问题。
三、问题解决过程
1、在网上百度很多都说解决方案是加如下参数:
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
或者加如下内容:
都试了一下,加了也没啥用。
2、终极解决方案
最后看有网页写到加入如下一行内容即可解决该问题,试了之后确实如此,网页可以正常访问,也没有出现报错了,成功截图并发送消息。
chrome_options.add_argument(f'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36')