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
View Code
 

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
View Code
 

3、  缓存文件夹的使用

使用cookies是一种保存会话的方式,但是他的实效性跟缓存文件夹的比起来时效性太短了,采用数据缓存就可以了

(1)打开浏览器的时候配置这个参数:--user-data-dir ,位置盘不要放C盘,这样子也可以减少c盘内存的消耗的增长

(2)无痕模式禁止使用,否则会导致缓存文件夹无法使用

1 chrome_options.add_argument(r'--user-data-dir=D:\chromedriver\account-cache' )
View Code

 

 

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
View Code

 

 

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")
View Code

 

这以上是近几个月用下来觉得还不错,综合整理记录下。

posted @ 2024-02-26 13:50  WangHello  阅读(69)  评论(0编辑  收藏  举报