selnium是一款很强大的浏览器自动化测试框架,直接运行在浏览器端,模拟用户操作,它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器及PhantomJS之类的无头浏览器。

安装和驱动下载

直接用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()