Selenium入门
1、下载
-
Selenium安装
pip install selenium
-
ChromeDriver的安装
- 确认本机的Chrome浏览器的版本号
- 前往ChromeDriver官方网站确认ChomeDriver的版本
- 下载。网址为:
https://chromedriver.storage.googleapis.com/index.html
- 将chromedriver.exe拖到Python的Scripts目录下
-
PhantomJS的安装【无界面模式,要求selenium<=3.8】
- 下载。网址为:
https://phantomjs.org/download.html
- 将phantomjs.exe拖到Python的Scripts目录下
- 下载。网址为:
2、使用
-
声明浏览器对象
from selenium import webdriver brower = webdriver.Chrome() brower = webdriver.Firefox() brower = webdriver.Edge() brower = webdriver.PhantomJS() brower = webdriver.Safari()
-
访问页面
from selenium import webdriver brower = webdriver.Chrome() brower.get('https://www.baidu.com') print(brower.page_source) # 显示网页代码 brower.close()
3、查找节点
-
单个节点
函数:
find_element()
举例:
browser.find_element(By.ID, 'q')【需要头文件from selenium.webdriver.common.by import By】
-
多个节点
函数:
find_elements()
4、节点交互
官方网站:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.taobao.com/")
search_box = browser.find_element_by_id("q") # 找到搜索框
button = browser.find_element_by_class_name("btn-search") # 找到搜索按钮
search_box.send_keys("iPad") # 在搜索框输入“iPad”
search_box.clear() # 清空搜索框文字
search_box.send_keys("iPhone") # 在搜索框输入“iPhone”
button.click() # 点击搜索按钮
5、动作链
官方网站:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get("https://www.taobao.com/")
browser.switch_to.frame('ifraameResult') # 切换Frame
source = browser.find_element(By.ID, 'draggable') # 需要移动的节点
target = browser.find_element(By.ID, 'droppable') # 目标节点
actions = ActionChains(browser) # 声明
actions.drag_and_drop(source, target) # 动作
actions.perform() # 执行
6、执行JavaScript
通过模拟运行JavaScript,提供Selenium API没有提供的操作
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.taobao.com/")
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') # 将进度条下拉到最底部
borwser.execute_script('alert("To Bottom")') # 弹出提示框
7、获取节点信息
使用以下方法的前提是选中这个节点。以logo为例
- 获取属性:
logo.get_attribute('class')
- 获取文本:
logo.text
- 获取id:
logo.id
- 获取位置:
logo.location
- 获取标签名:
logo.tag_name
- 获取大小:
logo.size
8、切换Frame
网页中有一种节点叫作iframe,即子Frame,相当于页面的子页面。通过switch_to_frame()
方法切换Frame
9、前进与后退
- 前进:
browser.forward()
- 后退:
browser.back()
10、Cookies
- 获取:
browser.get_cookies()
- 添加:
browser.add_cookies({'name':'xxx', 'xxx':'xxx', 'xxx':'xxx'})
- 删除:
browser.delete_all_cookies()
11、选项卡管理
- 获取当前开启的所有选项卡:
browser.window_handles
- 切换选项卡:
browser.switch_to_window(browser.window_handles[1])
,1为选项卡号
12、延时等待
举例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.sebdriver.support.ui import WebDriverWait
from selenium.sebdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get("https://www.taobao.com/")
wait = WebDriverWait(browser, 10) # 设置最长等待时候
input_box = wait.until(EC.presence_of_element_located((By.ID, 'q'))) # 判断节点是否被加载
button_box = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search'))) # 判断按钮是否可点击
"""
如果input_box与button_box没有加载出来,则抛出TimeoutException异常
"""
等待条件
title_is
:判断title是否出现title_contains
:判断title页面标题是否包含某些字符presence_of_element_located
:判断某个元素是否被加载到了dom树里,但是并不代表这个元素可见url_contains
:判断当前url是否包含某个urlurl_matches
:判断当前url是否符合某种格式url_to_be
:判断当前url是否出现url_changes
:判断当前url是否已经发生了变化visibility_of_element_located
:判断某个元素是否被添加到了dom树里,且宽高都大于0visibility_of
:判断看某个元素是否可见presence_of_all_elements_located
:判断至少有一个元素存在于dom树中,返回所有定位到的元素visibility_of_any_elements_located
:判断至少有一个元素在页面中可见visibility_of_all_elements_located
:判断是否所有元素都在页面中可见text_to_be_present_in_element
:判断指定的元素中是否包含了预期的字符串text_to_be_present_in_element_value
:判断指定的元素属性值中是否包含了预期的字符串frame_to_be_available_and_switch_to_it
:判断iframe是否可以switch进去invisibility_of_element_located
:判断某个元素是否在dom中不可见element_to_be_clickable
:判断某个元素是否可见并且是enable的,也就是说是是否可以点击staleness_of
:等待某个元素从dom中删除element_to_be_selected
:判断某个元素是否被选中了,一般用于下拉列表中element_located_to_be_selected
:与上面的意思一样,只不过上面实例化的时候传入的是元素对象,这个传入的是定位element_selection_state_to_be
:判断某个元素的选中状态是否符合预期element_located_selection_state_to_be
:与上面一样,只不过传值不同而已number_of_windows_to_be
:判断当前窗口数是否等于预期new_window_is_opened
:判断是否有窗口增加alert_is_present
:判断页面是否有弹窗