Selenium的基本操作
获取浏览器驱动寻找方式
1. 通过手动指定浏览器驱动路径
2. 通过 `$PATH`环境变量找寻浏览器驱动
可参考Python学习--Selenium模块简单介绍(1)
控制浏览器访问URL
browser.get(https://www.baidu.com/)
find系列函数定位元素
- `find_element_by_xxx` 返回第一个符合条件 `WebElement` - `find_elements_by_xxx` 返回符合条件所有元素包含了`WebEelemnt`列表
- `find`函数系列说明 - `find_element_by_class_name` 通过class 查询元素 - `find_element_by_id` 通过 ID - `find_element_by_name` 通过name - `find_element_by_tag_name` 通过标签名称 - `find_element_by_css_selector` css样式选择 - `find_element_by_link_text` 通过链接内容查找 - `find_element_by_partial_link_text` 通过链接内容包含的内容查找,模糊查询 - `find_element_by_xpath` 通过 xpath 查找数据
获取元素属性和文本内容
# 获取属性 element.get_attribute('属性名') # 获取文本内容 element.text
输入框输入内容
input_element.send_keys('博客园')
自动百度查找博客园
import time # 1. 导入模块 from selenium import webdriver # 2. 创建浏览器对象, browser = webdriver.Chrome() # 参数驱动路径,默认参数也是当前路径的chromedriver驱动 # 3. 输入网址 browser.get("https://www.baidu.com/") timeout = 60 start_time = time.time() while True: try: time.sleep(0.1) # 兼顾其他程序使用CPU资源 # 4. 找到输入框,输入关键词 input_element = browser.find_element_by_id('kw') input_element.send_keys("小a玖拾柒-博客园") # 查询博客园 # 5. 找到“百度一下”的按钮,点击一下按钮 button = browser.find_element_by_id('su') button.click() time.sleep(3) # 让网页加载完成 # 6. 找到作者的博客园链接 url_element = browser.find_element_by_link_text("小a玖拾柒 - 博客园") url_element.click() break except Exception as e: if time.time() > start_time: # 超时 print(e) break # 退出浏览器 time.sleep(3) browser.quit()
查看百度首页的链接(获取元素是文本内容和元素属性)
import time # 1. 导入模块 from selenium import webdriver # 2. 创建浏览器对象, browser = webdriver.Chrome() # 参数驱动路径,默认参数也是当前路径的chromedriver驱动 # 3. 输入网址 browser.get("https://www.baidu.com/") baidu_list = browser.find_elements_by_class_name("mnav") for item in baidu_list: # 获取元素是文本内容和元素属性 print("{0}:{1}".format(item.text, item.get_attribute("href"))) # 退出浏览器 time.sleep(5) browser.quit()
扩展:Selenium的自动等待方式
当控制浏览器时,浏览器正在加载页面同时又去获取数据导致浏览器寻找不到需要操作的元素引发异常。
- 方式一:强制等待,浪费时间
import time time.sleep(秒数)
- 方式二:隐性等待,缺点:无法控制 AJAX请求
browser.implicitly_wait(等待时间)
- 方式三:显性等待,每个元素都可以自己定义检查条件
手动编写:
timeout = 60 start_time = time.time() while True: try: time.sleep(0.1) # 兼顾其他程序使用CPU资源 # 4. 找到输入框,输入关键词 input_element = browser.find_element_by_id('kw') input_element.send_keys("小a玖拾柒-博客园") # 查询博客园 # 5. 找到“百度一下”的按钮,点击一下按钮 button = browser.find_element_by_id('su') button.click() time.sleep(3) # 让网页加载完成 # 6. 找到作者的博客园链接 url_element = browser.find_element_by_link_text("小a玖拾柒 - 博客园") url_element.click() break except Exception as e: if time.time() > start_time: # 超时 print(e) break
Selenium提供:
# 导入显性等待的API需要的模块 # 1> 等待对象模块 from selenium.webdriver.support.wait import WebDriverWait # 2> 导入等待条件模块 from selenium.webdriver.support import expected_conditions as EC # 3> 导入查询元素模块 from selenium.webdriver.common.by import By # 使用selenium api 实现显性等待 # 1> 创建等待对象 # 参数一 浏览器对象 # 参数二 超时时间 # 参数三 检查元素时间间隔 wait = WebDriverWait(browser,60,0.1) # presence_of_element_located 检查元素是否存在,参数是一个元祖,元祖内部描述等待元素查询方案 # visibility_of_element_located 检查元素是否可见 url_element= wait.until(EC.presence_of_element_located((By.CLASS_NAME,"favurl")))
url_element.click()