一.selenium介绍
- 1.一种web应用程序,自动化测试工具合集
- 2.用于:测试,屏幕抓取。浏览器模拟(爬虫)
- 3.支持浏览器:Firefox,IE,Chrome,Safari,Opera
- 4.以图像化方式在浏览器上录制与回访selenium脚本。 以脚本方式实现浏览器测试,支持多语言的一套API。 用于以服务的方式启动,支持远程控制,分布式部署。
二.需要下载的(环境搭建)
-
1.Python + pycharm (都有)
-
2.点击pychar中的view -> Tool Windows ->Terminal输入如下命令:
-
pip install selenium (在pycharm中下载selenium包)
-
由于下载太慢导致错误可以采用镜像网站下载:(命令如下)
-
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
-
3.与浏览器版本对应的驱动 下载地址:(https://blog.youkuaiyun.com/kenny_pj/article/details/103646745
三.调用驱动的方式
from selenium import webdriver #导包
- 常用方式:内部调用,驱动放在python目录下
driver = webdriver.Firefox()
- 复杂方式:外部调用,驱动可以放在任意地方
chrome_driver = 'E:\Python\python-3.9.0-amd64\chromedriver.exe'
driver = webdriver.Chrome(executable_path=chrome_driver)
四.简单访问一个页面
from selenium import webdriver
if __name__ == '__main__':
driver = webdriver.Firefox() #F大写,后面打括号
driver.get('https://www.baidu.com')
driver.maximize_window() #窗口最大化
pass
五.模拟浏览器操作
5.1先定位元素
1.有8种定位方式如图,下面说说xpath
方式1.绝对路径 (不稳定,页面元素变动,xpath也会变)
- 元素选择器右键选择元素–>右键复制–>复制xpath
ele = driver.find_element_by_xpath('/html/body/div[1]/div/div/div[3]/div/div[1]/a')
方式2.标签+属性定位
-
元素 < input name=“s1” id=“t1” class=“m1” type=“text”/>
xpath //标签[@属性=’属性值‘ and|or @属性=‘属性值’]
ele1 = driver.find_element_by_xpath("//input[@id='kw'and @class = 's_ipt' ]")
单引号内不能用单引号,用上转义字符 \
ele1 = driver.find_element_by_xpath('//input[@id=\'kw\'and @class = \'s_ipt\' ]')
- 用此方法可以通过父标签找子标签:
father = driver.find_element_by_xpath("//select[@id='wm']")
son = father.find_element_by_xpath("//option[@value='123'")
- 通过子标签找父标签
father = son.find_element_by_xpath('..') #..就是返回上一级
方式3.text()
- 百度首页有个新闻,获取这个元素可以用:
ele = driver.find_element_by_xpath('//*[text()="新闻"]')
方式4.模糊定位,包含:contains()
- 点击百度首页新闻还可以:
ele = driver.find_element_by_xpath("//a[contains(@href,'news')]") #属性后面不用=,因为这是模糊的,news.bai.com,只是包含news
方式5.starts-with(),ends-with()方式
表示以属性,属性值开头或者结尾。
2.xpath优缺点
- 缺点:
1.用到xpath要扫描整个页面,执行起来比较慢。
2.如果页面改动较大,那定位会失效,可维护性差
- 优点:
1.绝对路径非常方便。and|or很灵活
2.可以模糊定位:contains(),starts-with(),ends-with()
5.2再来操作
5.2.1.这里用到行为链
- 导包:
from selenium.webdriver.common.action_chains import ActionChains
- 驱动调用此包:
action = ActionChains(driver)
- 操作:
点击页面元素:结尾接.perform( )代表执行
action.click(ele).perform()
这是qq音乐首页:
点击‘关闭弹窗’–悬停到‘开通vip’–>等待10s–>点击‘音乐馆’–>等待3s–>点击‘输入框’–>输入‘程璧’–>点击‘搜索’–>表演
action.click(ele).move_to_element(ele1).pause(10).click(ele2).pause(3).click(ele3).send_keys('程璧').click(ele4).perform()
- 完整代码
from selenium import webdriver #驱动包
from selenium.webdriver.common.action_chains import ActionChains #行为链,操作鼠标的,键盘。
if __name__ == '__main__':
driver = webdriver.Firefox()
driver.implicitly_wait(5)
driver.maximize_window() #窗口最大化
driver.get('https://i.y.qq.com/n2/m/')
driver.implicitly_wait(10)
ele = driver.find_element_by_xpath('/html/body/div[10]/div[1]/a/i[1]')
ele1 = driver.find_element_by_xpath('/html/body/div[1]/div/div[2]/span/div[1]')
ele2 = driver.find_element_by_xpath('/html/body/div[1]/div/ul[1]/li[1]/a')
ele3 = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/div[1]/input')
ele4 = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/div[1]/button/i')
action = ActionChains(driver)
action.click(ele).move_to_element(ele1).pause(10).click(ele2).pause(3).click(ele3).send_keys('程璧').click(
ele4).perform()
pass
5.2.2.行为链操作大全
注意事项
- 设置等待时间,比方说有些网页一打开会有弹窗,如果不设置等待这个窗口弹出来的时间则运行不下去。
关于等待时间,这里很全:https://blog.youkuaiyun.com/sinat_41774836/article/details/88965281
和requests区别
- requests是直接请求服务器。这里爬虫是模拟浏览器行为。测前端的,其他工具postman,jmeter,以及用requests请求做不到这一点。