介绍

selenium 支持 Chrome、Firefox、Safari 等主流浏览器。下面以 Chrome 浏览器为例。

开始使用

  1. from selenium import webdriver # 导入 webdriver
  2. import time # selenium 经常会用到 time.sleep(time)。因为 selenium 可能会在网页没有完全加载完成时就去获取和操作 DOM,导致出错,所以适当使用 time.sleep(time) 以防出错
  3. driver = webdriver.Chrome() # 打开 Chrome 浏览器
  4. driver.get(url) # get 方法打开网页
  5. driver.maximize_window() # 最大化窗口(因为有时候需要根据屏幕像素定位,所以最大化是有必要的)
  6. driver.minimize_window() # 最小化窗口
  7. driver.page_source # 网页源代码
  8. driver.save_screenshot('screenshot.png') # 保存当前网页截图
  9. driver.close() # 关闭当前窗口
  10. driver.quit() # 关闭所有窗口并退出浏览器,清除临时目录下的临时文件

DOM 操作

查找元素

  1. el = driver.find_element_by_id(id) # 根据 id 查找元素。同样的方法还有根据 类名、标签名、xpath、css选择器 查找
  2. child_el = parent_el.find_element_by_class_name(class_name) # find_element(s)_by_xxx 方法也可以通过一个元素调用,这样只会在其子元素中查找符合条件的元素
  3. parent_el = child_el.find_element_by_xpath('./..') # selenium 没有原生提供根据子元素获取父元素的方法,只能通过 xpath 的语法来做到这一点

如果要获取兄弟结点,有两种方法:

  1. 先获取父节点,再通过父节点获取兄弟结点;
  2. 使用 xpath 语法中的 preceding-siblingfollowing-sibling 等(TODO

处理元素

  1. el.click() # 点击元素
  2. el.clear() # 如果是输入框,清空框里的东西
  3. el.send_keys(string) # 如果是输入框,将 string 填写到框中
  4. el.submit() # 自动寻找 el 最近的表单并提交
  5. el.save_screenshot("el_screenshot.png") # 保存当前元素的截图
  6. el.text # 元素的文本内容
  7. el.get_attribute(attr_name) # 获取元素某个属性的属性值
  8. el.value_of_css_property(style_name) # 获取元素的某个 css 属性的值

处理 cookies

  1. cookies = driver.get_cookies() # 获取 cookies(是一个列表。列表每个元素都是一个 cookie,以字典形式存储)
  2. driver.add_cookie(cookie) # 添加一个 cookie,以后继续通过 selenium 操作浏览器时都会使用这个 cookie
  3. for cookie in cookies: # 迭代添加所有 cookie
  4. driver.add_cookie(cookie)

处理对话框

  1. alert = driver.switch_to.alert # 定位到 alert 对话框
  2. alert.accept() # 相当于点击 alert 对话框中的“确定”按钮
  3. alert.dismiss() # 相当于点击 alert 对话框中的“取消”按钮
  4. alert.text # alert 对话框的文本内容

多个窗口的处理

  1. driver.window_handles # 所有窗口的句柄(是一个列表)
  2. driver.switch_to_window(handle) # 聚焦到某个窗口

处理 iframe

网页中存在 iframe 标签时,要想操作 iframe 包含的网页,必须:

  1. driver.switch_to_frame(iframe_id)

使用下面这行代码回到外层网页:

  1. driver.switch_to_default_content()

复杂点击和按键事件

单击事件是最常用的操作,可以直接 el.click() 调用。其他点击和按键事件则需要导入另一个类:

  1. from selenium.webdriver.common.action_chains import ActionChains # 导入 ActionChains 类
  2. ActionChains(driver).double_click(el).perform()
  3. # ActionChains(driver) ———— 创建对象,参数是 driver;
  4. # double_click(el) ———— 鼠标双击事件,参数是要双击的元素;
  5. # 写了 perform(),该操作才会执行

执行 JS 代码

  1. driver.execute_script("alert(1)")

技巧:处理延时加载的网页

有些网页内容或图片在用户下拉后才动态加载出来,此时就需要模拟这个下拉过程。

下面这段代码的功能是,将网页每秒向下滚动 500 像素:

  1. top = 500 # 不要设太大也不要太小,500 差不多
  2. scrollHeight = driver.execute_script("return document.body.scrollHeight") # 获取当前网页高度
  3. while top < scrollHeight:
  4. print("当前距网页顶部:" + str(top) + "px")
  5. driver.execute_script("document.documentElement.scrollTop = " + str(top)) # 滚动
  6. top += 500
  7. time.sleep(1)
  8. scrollHeight = driver.execute_script("return document.body.scrollHeight")