Python+selenium常用API


之前刚开始做selenium自动化的时候也稍稍总结过。时隔数月,再次捡起,感触颇深,孔子曰:“温故而知新”。咳咳~好了好了,进入正题。

这里想再总结一下遇到的问题。

需求:有这样一个CSV文件,需要分析出CSV中的某些内容,然后自动从某个网站上去查询,然后判断查询结果有没有。

csv的分析就不在这里记录了,主要记录一下主要用到的知识。

首先当然是元素的定位,selenium自动化想玩儿得转,这是基本功。

一、元素定位


webdriver.find_element_by_id()  # 元素id属性定位
webdriver.find_element_by_css_selector()  #css选择器定位
webdriver.find_element_by_xpath()  # xpath定位
...

更多请参考这篇博客https://blog.csdn.net/liu_xzhen/article/details/88885362,介绍的很详细。
在我看来最好用的应该是find_element_by_css_selector这种方式,但是这种方式需要你熟知CSS选择器的相关语法。玩转之后小公鸡点到谁就是谁,简直好用的不要不要的。

这个任务让我印象最深的是属性选择器,不知道官方是不是这样叫的,但我觉得很契合。有时候网页上的动作只是动态追加了某个元素的属性,我们就能通过这种方式来处理。

例:input[name='kw'] # 定位input类型的元素且name属性值位‘kw’的元素

元素定位问题处理完以后遇到最多的问题就是超时问题。

二、超时问题

网页加载的快慢跟网速有很大的关系。随着网络的波动,我们无法准确的把控等待时间。之前我也是傻傻的等,一秒不行设两秒…这样就显得我很呆。所以这也是我本次任务的一个很大的收获。

处理超时问题主要三种:

1、time模块的sheep函数,跟java的线程类似,程序暂停指定的时间再继续执行,也被叫做显示等待。
time.sleep(30)  # 等待固定时长后继续执行

但这种方式显然不合理,因为时长是固定的,本来加载时间就不一定。虽然我之前也是用的这种,但这样才能凸显出我的进步嘛,嘿嘿~~

2、浏览器的级别的等待也叫隐式等待,这种方式区别于,时间是最大时常,但我感觉跟前边显示等待没有什么太大的区别,当然我也没有使用这种方式。
self.chrome.implicitly_wait(30) # 最大等待指定时长后继续执行
3、WebDriverWait模块的Wait函数,webdriver模块的相关内置函数。区别与隐式等待,这种方式可以限定条件,在指定时间内满足某个条件时继续执行。
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as Wait
# 等待浏览器最长60秒,知道id为idSIButton9的元素被加载
Wait(self.chrome, 60).until(EC.presence_of_element_located((By.ID, "idSIButton9"))) 

在get到这个知识点之前,我一直都是自己写循环去判断的,用了这个感觉都能多活几年。嘿嘿~~
这个还有方式可以根据自己的需要去选择,可以参考这篇博客https://www.cnblogs.com/qingbaobei7370/p/11002840.html

三、浏览器启动参数设置

这个没啥好说的直接贴代码呗~

# options = Options()                                     # 创建配置对象
# options.add_argument('--window-size=1300,900')          # 配置浏览器窗口大小
# options.add_argument('--incognito')                     # 配置浏览器主题为黑色
# options.add_argument('--ignore-certificate-errors')     # 忽略连接警告信息
# options.add_experimental_option("detach", True)         # 不自动关闭浏览器
# options.add_argument("--headless")                      # 设置无窗口模式
# options.add_argument('--start-maximized')               # 初始最大化
# 禁用浏览器正在被自动化程序控制的提示
# options.add_experimental_option('excludeSwitches', ['enable-automation'])
# options.add_experimental_option('useAutomationExtension', False) # 禁用自动扩展
# options.add_extension('vimm_chrome_proxyauth_plugin.zip') # 添加代理插件
# options.add_argument('--incognito')                   # 隐身模式(无痕模式)
# options.add_argument('--disable-javascript')          # 禁用javascript
# options.add_argument('--user-agent=Mozilla/5.0 HAHA') # 配置对象添加替换User-Agent的命令
# options.add_argument('--disable-javascript')          # 禁用javascript
# options.add_argument("--disable-gpu")                 # 禁用gpu
# 禁止加载图片
# options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) 

还有一点是关于浏览器退出的问题,chrome.quit()函数可以退出浏览器,但是我发现浏览器关闭后,后台驱动并未退出,导致每次运行都会有一个驱动在后台运行。为此我在这里也记录一下,退出驱动的方法。

退出驱动我百度到的主要有两种,一种是通过进程关闭驱动;另一种是先启动驱动服务,在启动浏览器,最后退出驱动服务。我这里采用了第二种:

service = Service('chromedriver.exe')  # 创建谷歌浏览器驱动服务
service.command_line_args()
service.start() # 启动浏览器服务
webdriver.Chrome() # 启动浏览器

四、浏览器基本操作

最后复习一下浏览器相关的基本操作,虽然这次任务并没有用到。

# 1、弹窗处理

webdriver.switch_to.alert.accept() # 接受弹窗
webdriver.switch_to.alert.dismiss() # 取消弹窗
webdriver.switch_to.alert.text # 获取弹窗信息
...

# 2、标签页处理

webdriver.window_handles # 获取所有标签页
webdriver.switch_to.window(window_handles[index])  # 切换到某个标签页 
webdriver.close() # 关闭当前标签页
webdriver.execute_script(f"window.open()")  # 新开标签页
...

# 3、浏览器缓存处理

# 清除缓存
webdriver.get('chrome://settings/clearBrowserData')  # 跳转到浏览器清除缓存设置
webdriver.find_element_by_xpath('//settings-ui').send_keys(Keys.ENTER)  # 模拟按键输入Enter
...

# 4、浏览器截图

webdriver.get_screenshot_as_file(save_path)  # 浏览器窗口截图并保存到指定位置

# 5、关闭浏览器

webdriver.quit() #退出相关驱动程序,并关闭所有窗口

常用操作就先总结到到这,后面会总结一下遇到的一些难踩的坑。欢迎大家探讨,有什么问题的地方还望指正。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐