selnium是一款很强大的浏览器自动化测试框架,直接运行在浏览器端,模拟用户操作,它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器及PhantomJS之类的无头浏览器。
- Selnium官方参考文档:http://selenium-python.readthedocs.io/index.html
- 推荐一篇介绍Selnium的博客:https://cuiqingcai.com/2599.html
安装和驱动下载
直接用PIP安装即可
pip install selenium
下载对应浏览器的驱动包
- Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
- Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- Firefox: https://github.com/mozilla/geckodriver/releases
- Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/
将下载好的驱动包放到对应的目录下
mac对应放驱动包的位置为 /usr/bin
,但是因为mac的Rootless保护机制,会导致权限拒绝。我的办法是将驱动包放到/usr/local/bin
,然后在环境变量的PATH中加入就可以了。
快速开始
下面是核心的代码示例,看完这个基本就可以动手了
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
更多的使用方法技巧,请参考我上面推荐的博客,写的非常详细。
定位和切换frame
在用selenium定位页面元素的时候会遇到定位不到的问题,这时候就需要注意切换frame,这是一个坑。
用法就是switch_to.frame(reference)
driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0
driver.switch_to.frame("frame1") # 2.用id来定位
driver.switch_to.frame("myframe") # 3.用name来定位
driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用WebElement对象来定位
frame1 = driver.find_element_by_tag_name("iframe")
driver.switch_to_frame(frame1) # 5.用标签名来定位
浏览器下载配置
Chrome浏览器
参数配置
- download.default_directory:设置下载路径
- profile.default_content_settings.popups:设置为 0 禁止弹出窗口
## 设置下载目录
dir = '/xxx/pachong/down/'
options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': dir}
options.add_experimental_option('prefs', prefs)
## 启动浏览器
browser = webdriver.Chrome(chrome_options=options)
firefox浏览器
参数配置
- browser.download.dir:指定下载路径
- browser.download.folderList:设置成 2 表示使用自定义下载路径;设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径
- browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器
- browser.helperApps.neverAsk.saveToDisk:对所给出文件类型不再弹出框进行询问
profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.dir', '/xxx/pachong/down/')
profile.set_preference('browser.download.folderList', 2)
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip')
## 启动浏览器
driver = webdriver.Firefox(firefox_profile=profile)
配合Urllib的使用
场景为登录某学院教务网,然后下载成绩单。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request
driver = webdriver.Chrome()
driver.get('http://xxxxx.com/')
time.sleep(5)
frame1 = driver.find_element_by_tag_name("iframe")
driver.switch_to_frame(frame1)
elem_user = driver.find_element_by_id("txt_asmcdefsddsd")
elem_user.send_keys('xxxx')
elem_pw = driver.find_element_by_name("txt_pewerwedsdfsdff")
elem_pw.send_keys('xxxxx')
elem_yz = driver.find_element_by_name("txt_sdertfgsadscxcadsads")
elem_yz.clear()
yzm = input("请输入验证码:")
elem_yz.send_keys(yzm)
elem_yz.send_keys(Keys.RETURN)
cookie = [item["name"] + "=" + item["value"] for item in driver.get_cookies()]
cookiestr = ';'.join(item for item in cookie)
url = "http://xxxxx.com/xscj/Stu_MyScore_Drawimg.aspx?x=1&h=2&w=887&xnxq=20081&xn=2008&xq=1&rpt=1&rad=2&zfx=0"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
'cookie': cookiestr}
req = urllib.request.Request(url, headers=headers)
html = urllib.request.urlopen(req).read()
fhandle = open("./1.jpg", "wb")
fhandle.write(html)
fhandle.close()
time.sleep(5)
driver.quit()