selenium自动化好用的工具,亲测亲是很好用
rpa自动化这个词,在今天的这个时代相应大家并不陌生,自动化可以帮人做掉很多繁琐的事情,它可以不休息,只要给他写好程序,配置部署就可以一直在工作,废话不多说,直接上干货
1、selenium的sessionid的使用
selenium分为本地打开和远程模式打开,有时候我们不想在操作自动化的过程中,通常都是打开一个浏览器做完事情给他关闭,如果下次要用再打开,但是其实登录的过程是稍微费时间的,我们可以用sessionid让浏览器一直活着。
(1)必须使用远程模式
(2)将获取的sessionid存起来,下次打开一个新的直接用旧的赋值,新的关闭
1 # 查看文件是否有 session_id 2 with open(driversession_full_name, "r+") as f: 3 content = f.read() 4 5 # 获取session_id 6 session_id = content if content else "" 7 8 if not session_id: 9 #如果没有sessionid就是首次打开 10 first_flag,driver = fisrt_open(url, username, password,driversession_full_name,img_screen,img_captcha) 11 return first_flag,driver 12 else: 13 remote_url = "http://localhost:4444/wd/hub" 14 15 # 创建DesiredCapabilities对象,指定远程浏览器的名称和版本 16 desired_capabilities = DesiredCapabilities.CHROME.copy() 17 desired_capabilities['browserName'] = 'chrome' 18 desired_capabilities['version'] = '' # 这里设置为空字符串,表示使用最新版本的Chrome浏览器 19 20 # 创建WebDriver对象,连接到远程浏览器 21 driver = webdriver.Remote(command_executor=remote_url, desired_capabilities=desired_capabilities) 22 23 # 赋值给新对象 旧对象关闭 24 new_driver = driver 25 driver.close() 26 new_driver.session_id = session_id
2、 cookies的使用
其实有时候免登录,也可以将浏览器的cookies值存下来入库,下次使用的时候直接load进去
1 #cookies获取 可以通过json.dumps方式入库 json.dumps(cookies) 2 cookies = driver.get_cookies() 3 #使用cookies的时候 打开到对应地址的登陆页面 进行load_cookie 4 def load_cookie(driver, cookies): 5 try: 6 cookies = json.loads(cookies) 7 for cookie in cookies: 8 driver.add_cookie(cookie) 9 driver.refresh() 10 return driver 11 except: 12 return driver
3、 缓存文件夹的使用
使用cookies是一种保存会话的方式,但是他的实效性跟缓存文件夹的比起来时效性太短了,采用数据缓存就可以了
(1)打开浏览器的时候配置这个参数:--user-data-dir ,位置盘不要放C盘,这样子也可以减少c盘内存的消耗的增长
(2)无痕模式禁止使用,否则会导致缓存文件夹无法使用
1 chrome_options.add_argument(r'--user-data-dir=D:\chromedriver\account-cache' )
4、 浏览器监听功能的使用
在自动化的过程中,其实除了从网页中获取元素的信息情况,也可以通过接口,可以采用监听接口的方式获取数据,这边封装了一个监听基于selenium,使用的时候就实例化这个类,按对应的端口创建selenium和代理服务及端口,不用的时候stop即可,程序会做对应的关闭。
(1)本地有一个java监听文件browsermob-proxy-2.1.4
(2)监听的内容带点加密模式,需要解码,以下包含创建监听获取接口结果、获取接口完整的api等
1 class SeleniumProxy(): 2 def __init__(self, port=20000): 3 self.proxy = None # 代理 4 self.driver = None # 浏览器 5 self.server = None # 监听服务 6 self.port = port # 服务端口 7 self.proxy_port = port + 1000 # 代理端口 8 self.chrome_pid = None # 浏览器 9 self.create_proxy() 10 11 def create_proxy(self): 12 # 原本使用 13 self.server = Server(r'D:\javajar\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat', options={"port": self.port}) 14 self.server.start() 15 self.proxy = self.server.create_proxy({"port": self.proxy_port, "proxyPort": self.proxy_port, "proxyPerProcess": True, "proxyVia": True, "trustAllServers": True}) 16 17 def create_driver(self, incognito=False, account=None, use_cache=False): 18 chrome_options = Options() 19 # normal:等待整个页面加载完毕再开始执行操作--默认 20 # eager:等待整个dom树加载完成,即DOMContentLoaded这个事件完成,也就是只要 HTML 完全加载和解析完毕就开始执行操作。放弃等待图片、样式、子帧的加载。 21 # none:等待html下载完成,哪怕还没开始解析就开始执行操作。 22 # chrome_options.page_load_strategy = 'eager' 23 chrome_options.add_argument('--no-sandbox') 24 chrome_options.add_argument('--disable-gpu') 25 chrome_options.add_argument('--disable-cache') 26 chrome_options.add_argument("--disable-application-cache") 27 if use_cache: 28 if not account: 29 raise ValueError("启用缓存时,account为必传参数") 30 #如果要用缓存 禁用无痕模式 无痕模式一开 缓存就不能用了 31 # chrome_options.add_argument(r'--disk-cache-dir=D:\chromedriver\chrome-cache\%s' % account) # 指定硬盘缓存路径 32 chrome_options.add_argument(r'--user-data-dir=D:\chromedriver\account-cache\%s' % account) # 指定数据缓存路径 33 chrome_options.add_argument('--proxy-server={0}'.format(self.proxy.proxy)) 34 chrome_options.add_argument('--ignore-certificate-errors') 35 chrome_options.add_argument('--ignore-urlfetcher-cert-requests') 36 chrome_options.add_argument("--disable-blink-features=AutomationControlled") 37 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) 38 chrome_options.add_experimental_option("useAutomationExtension",'False') 39 # 加载插件的路径 40 # chrome_options.add_argument("--load-extension=D:\chromedriver\contentChecker") 41 if incognito: 42 chrome_options.add_argument("--incognito") # 启用无痕模式 43 44 remote_url = "http://localhost:4444/wd/hub" 45 46 # 创建DesiredCapabilities对象,指定远程浏览器的名称和版本 47 desired_capabilities = DesiredCapabilities.CHROME.copy() 48 desired_capabilities['browserName'] = 'chrome' 49 desired_capabilities['version'] = '' # 这里设置为空字符串,表示使用最新版本的Chrome浏览器 50 # self.driver = webdriver.Remote( 51 # command_executor=remote_url, 52 # desired_capabilities=desired_capabilities, 53 # options=chrome_options) 54 55 #走本地打开 56 self.driver = webdriver.Chrome( 57 # desired_capabilities=desired_capabilities, 58 options=chrome_options) 59 self.chrome_pid = self.driver.service.process.pid 60 self.driver.maximize_window() 61 return self.driver 62 63 # 修改driver文件下载路径 64 def change_download_path(self, path): 65 params = {"behavior": "allow", "downloadPath": path} 66 self.driver.execute_cdp_cmd("Page.setDownloadBehavior", params) 67 68 # 开启监听,重复调用可重置 69 def create_har(self): 70 self.proxy.new_har("doudian_har_%s" % self.proxy_port, options={'captureHeaders': True, 'captureContent': True, 'captureBinaryContent': True}) 71 72 def get_result(self, api, set_time=5): 73 for i in range(3): # 循环3次,如果接口还没有响应,没有数据 74 logger.info("第%s次等待接口响应结果" % i) 75 result = self.proxy.har 76 for entry in result['log']['entries']: 77 _url = entry['request']['url'] 78 # 根据URL找到数据接口 79 if api in _url: 80 _response = entry['response'] 81 _content = _response['content'].get('text') 82 if not _content: 83 break 84 # 获取接口返回内容 85 return self.decode_data(_content, api) 86 # set_time = set_time+2 87 time.sleep(set_time) 88 return [] 89 90 def get_full_api(self, api, set_time=5): 91 for i in range(3): # 循环3次,如果接口还没有响应,没有数据 92 logger.info("第%s次等待接口响应结果" % i) 93 result = self.proxy.har 94 for entry in result['log']['entries']: 95 _url = entry['request']['url'] 96 # 根据URL找到数据接口 97 if api in _url: 98 _response = entry['response'] 99 _content = _response['content'].get('text') 100 if not _content: 101 break 102 # 获取接口返回内容 103 return {"url": _url, "result": self.decode_data(_content, api)} 104 # set_time = set_time+2 105 time.sleep(set_time) 106 return {} 107 108 def decode_data(self, data, api): 109 try: 110 decoded_data = base64.b64decode(data) 111 return brotli.decompress(decoded_data).decode('utf-8') 112 except: 113 logger.info("响应结果编码错误") 114 logger.info(data) 115 try: 116 data = json.loads(data) 117 except: 118 pass 119 return json.dumps({'msg': '响应结果编码错误', 'data': data, 'api': api}) 120 121 def stop_all(self): 122 if self.server: 123 self.server.stop() 124 if self.driver: 125 self.driver.quit() 126 if self.proxy: 127 self.proxy.close() 128 # logger.info(self.chrome_pid) 129 try: 130 kill_processes_by_port(self.port, kill_java=False) 131 except: 132 pass 133 try: 134 process = psutil.Process(self.chrome_pid) 135 process.terminate() 136 except: 137 pass
5、 也可以接管打开浏览器,对于-remote-debugging-port值,可以指定任何打开的端口。对于-user-data-dir标记,指定创建新Chrome配置文件的目录。它是为了确保在单独的配置文件中启动chrome,不会污染你的默认配置文件。
(1)将chrome的可执行路径配置进环境变量path
(2)将chromedriver的可执行路径配置进环境变量path
1 #打开cmd 2 chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile" 3 4 #python代码 5 from selenium import webdriver 6 from selenium.webdriver.chrome.options import Options 7 8 9 chrome_options = Options() 10 chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") 11 # driver就是当前浏览器窗口 12 driver = webdriver.Chrome(options=chrome_options) 13 driver.get("https://www.baidu.com")
这以上是近几个月用下来觉得还不错,综合整理记录下。