Python Selenium安装
python selenium模块学习
Python Selenium 安装
Selenium 一款 Web 应用程序测试的工具
模拟Web浏览器操作,当前可支持的浏览器有IE,Google chrome,Firefox等(其实不止,还有safari、opera等等,但我只学了这三个)。
支持平台:Windows,Linux,Mac等操作系统
在使用不用浏览器时,需要使用不同浏览器插件,以下是插件下载地址:
IE浏览器:
http://selenium-release.storage.googleapis.com/index.html
Chrome浏览器:
http://chromedriver.storage.googleapis.com/index.html
Firefox浏览器:
https://registry.npmmirror.com/binary.html?path=geckodriver/
或者
https://github.com/mozilla/geckodriver
使用selenium前一定要有这个插件!!!
一、插件下载及存放位置
我这以Firefox为例,所以下载geckodriver
将该文件拷贝到python安装路径下的Scripts文件夹下就可以了。
如果不知道安装路径可以在“我的电脑”->“高级系统设置”->"高级"里点击环境变量,找到Path,就可以查看Scripts的绝对路径了。
二、Selenium模块安装
全局模式下安装(不建议用全局模式,打包会出错):
pip install selenium
pycharm 项目下安装
到Settings>>Project:XXX>>Python Interpreter下点击“+”添加模块:
2.1镜像源地址
这里提个额外话,下载模块慢的话,可以尝试国内的镜像源:
清华镜像:
https://pypi.tuna.tsinghua.edu.cn/simple/
百度镜像:
https://mirror.baidu.com/pypi/simple/
阿里镜像:
https://mirrors.aliyun.com/pypi/simple/
全局安装是在cmd输入:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ 模块名.py
最新版本的Pycharm的Manage Repositories不在Settings里了,而是在下面的Python Packages里
在Repository URL里填写镜像源地址就行。
三、Selenium 库
3.1创建一个浏览器
from selenium import webdriver
driver = webdriver.Firefox()
3.1.1浏览器无窗口模式(新版本)
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
option = Options()
option.add_argument('--headless')
driver = webdriver.Firefox(options=option)
3.1.2加载配置文件的浏览器
首先,打开我们已经登录过,或配置过的火狐浏览器,点击右上角的“三横杠”,点击“帮助”,再点击“更多排障信息”,找到配置文件夹一行,复制路径
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
option = Options()
option.add_argument('--headless')
option.profile = '上面配置文件的路径'
driver = webdriver.Firefox(options=option)
提示:这里会报warring
DeprecationWarning: Setting a profile has been deprecated. Please use the set_preference and install_addons methods
提示说设置配置文件将弃用,但这里只是warring,不会影响使用。
3.1.3Selenium元素定位
在网页HTML页面中,会使用到很多标签,例如:id,name,class,href,tag等(这写都是html知识,需要学会),selenium库提供了两个查找元素的方法
3.1.3.1find_element和find_elements
find_element,返回一个类,通常用来查找有唯一属性的元素
find_elements,返回一个包含多个类的列表,通常用来查找同属性的多个元素
option = Options()
option.add_argument('--headless')
driver = webdriver.Firefox(options=option)
driver.get('https://www.baidu.com')
a = driver.find_elements(By.TAG_NAME,'a')
b = driver.find_element(By.TAG_NAME,'a')
print(type(a))
print(type(b))
3.1.3.2By
By是selenium4新的写法,以前版本是driver.find_element_by_id
,driver.find_element_by_tag_name
这样的写法,现在使用By之前,需要先导入
from selenium.webdriver.common.by import By
By有8种定位元素的方法
方法 | 描述 |
---|---|
By.ID | 通过元素的id属性定位 |
By.NAME | 通过元素的name属性定位 |
By.CLASS_NAME | 通过元素的class属性定位 |
By.TAG_NAME | 通过元素的标签定位 |
By.LINK_TEXT | 通过超链接载体定位(精准) |
By.PARTIAL_LINK_TEXT | 通过超链接载体定位(部分) |
By.XPATH | 通过XPATH表达式定位 |
By.CSS_SELECTOR | 通过CSS表达式定位 |
- By.ID
By.ID,按元素属性ID来定位元素
例如定位登录,可以通过ID定位
driver = webdriver.Firefox()
driver.get('https://www.baidu.com')
driver.find_element(By.ID,'s-top-loginbtn').click() # click()点击登录
- By.NAME
By.NAME通过元素的name属性定位
driver = webdriver.Firefox()
driver.get('https://www.baidu.com')
driver.find_element(By.NAME,'wd').send_keys('selenium')
- By.CLASS_NAME
By.CLASS_NAME通过元素的class属性定位
driver = webdriver.Firefox(options=option)
driver.get('https://www.baidu.com')
driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('selenium')
结果跟By.NAME一样
- By.TAG_NAME
By.TAG_NAME是通过元素的标签定位的,但这种的具有唯一性,如果你只是想定位一个元素,那该元素在html的标签属性必须是唯一一个,不然存在多个的情况下,则会定位到标签。
By.TAG_NAME,在使用find_element会输出html里第一个标签的元素,使用find_elements会输出html所有该标签的元素。
driver = webdriver.Firefox()
driver.get(url='https://www.baidu.com')
a = driver.find_element(By.TAG_NAME,'a')#a是个类对象
#这里可以通过get_attribute()来获取我们想要的值
#例如,我们想要a指向的链接
print(a.get_attribute('href'))
driver = webdriver.Firefox()
driver.get(url='https://www.baidu.com')
a = driver.find_elements(By.TAG_NAME,'a')
print(len(a)) #53个
for i in a:
print(i.get_attribute('href'))
- By.LINK_TEXT
By.LINK_TEXT是通过<a></a>
之间的text文本定位的
driver = webdriver.Firefox(options=option)
driver.get(url='https://www.baidu.com')
a = driver.find_element(By.LINK_TEXT,'图片')
print(a.get_attribute('href'))
- By.PARTIAL_LINK_TEXT
By.PARTIAL_LINK_TEXT,跟LINK_TEXT差不多,LINK_TEXT是精准匹配,PARTIAL_LINK_TEXT是部分匹配,也就说如果想跟上面LINK_TEXT一样,定位到图片的话,PARTIAL_LINK_TEXT只需输入‘图’或‘片’。
driver = webdriver.Firefox(options=option)
driver.get(url='https://www.baidu.com')
a = driver.find_element(By.PARTIAL_LINK_TEXT,'图')
print(a.get_attribute('href'))
结果和上面的一样
- By.XPATH
By.XPATH,XPATH是用在XML文档中查找信息的语言,比较复杂,要学会XPATH,得知道元素对应XPATH的表达式怎么写,怎么修改表格式不会出错。
学习资料参考:
https://www.runoob.com/xpath/xpath-tutorial.html
捷径:
在检查html框架代码中,找到想定位的元素,右键点击,复制,XPATH,就可以将该元素在html里的XPATH表达式复制出来
driver = webdriver.Firefox(options=option)
driver.get(url='https://www.baidu.com')
a = driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/div[3]/a[6]')
print(a.get_attribute('href'))
结果跟LINK_TEXT一样
- By.CSS_SELECTOR
By.CSS_SELECTOR,跟XPATH是差不多的,它是通过CSS选择器表达式定位的。
参考资料:
https://blog.csdn.net/weixin_56349063/article/details/121848398
捷径:
driver = webdriver.Firefox(options=option)
driver.get(url='https://www.baidu.com')
a = driver.find_element(By.CSS_SELECTOR,'a.mnav:nth-child(6)')
print(a.get_attribute('href'))
结果跟上面的XPATH一样。
3.1.4Selenium窗口切换
3.1.4.1 switch_to.window
switch_to.window 浏览器窗口切换
在自动化过程会涉及到浏览器新窗口的打开,想找的元素在新的窗口里,如果不进行切换,那driver的焦点就会在老窗口里,这样肯定是找不到,也有可能是找不对。
所以switch_to.window,就是让driver切换到指定的窗口里。
...
driver.switch_to.window(driver.window_handles[-1])
# window_handles 返回当前会话所有窗口列表
# -1选择列表中倒数第一个,这个学习python基础的时候就学过了
# -1也代表着我要切换到最新打开的窗口
3.1.4.2 switch_to.frame
switch_to.frame 页面iframe/frame框架切换
跟window一样,在同一个html页面,也存在不同frame,如果driver没有切换到元素所在的frame,同样是会报错的。
driver的焦点在起初访问页面是默认frame,这个frame需要检查一下html代码
...
driver.switch_to.frame('frame name')
# frame name 是frame的name属性
想要切换回默认frame,则需要输入以下代码:
switch_to.default_content()
# 将driver的焦点切换回默认frame
先写到这吧,后续学习完持续更新
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)