selenium
selenium
selenium使用方法
行为链
-
介绍 —— 模拟操作鼠标的一系列动作完成某个具体操作,这一系列动作称为行为链。selenium可以通过ActionChains类来完成这些行为链
-
调用方法:
from selenium.webdriver.common.action_chains import ActionChains
行为链变量 = ActionChains(变量) —— ‘变量’为《selenium(上)》里chromedriver调用方法的变量 -
行为链变量常使用的方法
方法 | 含义 |
---|---|
click(on_element = None) | 单击一个元素,如果为None,则单击当前鼠标位置 |
click_and_hold(on_element = None) | 在元素上按住鼠标左键,如果为None,则单击当前鼠标位置 |
context_click(on_element = None) | 在元素上单击鼠标右键,如果为None,则单击当前鼠标位置 |
double_click(on_element = None) | 双击一个元素,如果为None,则单击当前鼠标位置 |
drag_and_drop(source,target) | 拖动元素,source为元素的初始位置,target为元素被拖动的目标位置 |
key_down(value,element=None) | 按下按键(Crrl、Alt和Shift),如果element为None,发送按键到当前元素位置(通常element参数为None) |
key_up(value, elemnet=None) | 松开按键(Crrl、Alt和Shift),如果element为None,发送按键到当前元素位置(通常element参数为None) |
move_to_element(to_element) | 将鼠标移动到元素中间,to_element参数为需要移动到的元素 |
pause(seconds) | 暂停输入多少秒 |
perform() | 保存全部行为动作,需要在行为链最后一行写入 |
release(on_element=None) | 松开鼠标左键(配合click_and_hold方法使用),如果为None,则在当前鼠标位置松开 |
cookie操作方法
- 获取cookie流程
- 获取cookie所有数据
- 提取cookie需要的数据
- 处理数据成cookie
- 删除cookie
获取cookie所有数据:
cookie变量 = 变量.getcookies() —— 获取cookie所有内容(返回list对象)
from selenium import webdriver
drive = webdriver.Edge()
drive.get('https://www.baidu.com')
cookie = drive.get_cookies()
print(cookie)
'''
[{'domain': '.baidu.com', 'expiry': 1609837151, 'httpOnly': False, 'name': 'BA_HECTOR', 'path': '/', 'secure': False, 'value': '8t0420aka4252l6h6i1fv872f0r'}, {'domain': '.baidu.com', 'expiry': 3757317198, 'httpOnly': False, 'name': 'BAIDUID_BFESS', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '98CDE28CD1BD0965BAD73441747032A7:FG=1'}, {'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '33425_1452_33403_33306_31253_33284_33286_33343_33313_33312_33311_33310_33335_33309_26350_33308_33307_33267_33389_33370'}, {'domain': '.baidu.com', 'expiry': 1641369551, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '98CDE28CD1BD0965D3E91C8785CBFE85:FG=1'}, {'domain': '.baidu.com', 'expiry': 3757317198, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '98CDE28CD1BD0965BAD73441747032A7'}, {'domain': '.baidu.com', 'expiry': 3757317198, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1609833551'}, {'domain': 'www.baidu.com', 'expiry': 1610697551, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'}, {'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '1'}]
'''
提取cookie需要的数据
- 列表中每个字典的name值和value值是cookie需要的数据(如下图),并用等号相连。(数据如上面代码块,)
cookie数据
cookie = [item[name] + '=' + item[value] for item in cookie]
print(cookie)
'''
['BA_HECTOR=8t0420aka4252l6h6i1fv872f0r', 'BAIDUID_BFESS=98CDE28CD1BD0965BAD73441747032A7:FG=1', 'H_PS_PSSID=33425_1452_33403_33306_31253_33284_33286_33343_33313_33312_33311_33310_33335_33309_26350_33308_33307_33267_33389_33370', 'BAIDUID=98CDE28CD1BD0965D3E91C8785CBFE85:FG=1', 'BIDUPSID=98CDE28CD1BD0965BAD73441747032A7', 'PSTM=1609833551', 'BD_UPN=12314753', 'BD_HOME=1']
'''
处理数据成cookie
- cookie的每个值之间用分号分割且有一个空格
cookie_str = '; '.join(item for item in cookie)
print(cookie_str)
'''
BA_HECTOR=8t0420aka4252l6h6i1fv872f0r; BAIDUID_BFESS=98CDE28CD1BD0965BAD73441747032A7:FG=1; H_PS_PSSID=33425_1452_33403_33306_31253_33284_33286_33343_33313_33312_33311_33310_33335_33309_26350_33308_33307_33267_33389_33370; BAIDUID=98CDE28CD1BD0965D3E91C8785CBFE85:FG=1; BIDUPSID=98CDE28CD1BD0965BAD73441747032A7; PSTM=1609833551; BD_UPN=12314753; BD_HOME=1
'''
删除cookie
- 使用方法:
- 删除指定cookie
变量.delete_cookie(‘指定cookie值’) - 删除所有cookie
变量.delete_all_cookies()
- 删除指定cookie
页面等待
- 简介 —— 网页内的元素可能在不同的时间载入,因此会加大定位元素或操作元素的困难程度,页面等待是为解决这个问题
- 两种类型 —— 隐式等待和显示等待
- 隐式等待 —— 如果能找到相关数据时会直接执行后续程序,如果不能找到相关数据时,会根据设置的时间进行等待
- 显示等待 —— 当确定的条件触发后才执行后面的程序
隐式等待
- 使用方法:
变量.implicitly_wait(seconds)
显示等待
-
显示等待的条件触发需要配合预期条件来完成
- 显示等待的调用:
from selenium.webdriver.support.ui import WebDriverWait - 预期条件的调用:
from selenium.webdriver.support import expected_conditions
- 显示等待的调用:
-
使用方法:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditionsWebDriverWait(变量, seconds).unitl(expected_conditions.text_to_be_present_in_element_value(locator=(By.ID,‘id值’), text)) —— 以文本会出现在指定元素的值里举例(locator为元组)
预期条件支持的常用方法(expected_conditions的方法)
- locator参数 —— 使用By方法定位元素的元组,例:(By.ID,‘id值’)
- element参数 —— 获取的WebElement元素对象
- 通常未达到预期条件的均会报错
方法 | 含义 |
---|---|
element_located_selection_state_to_be(locator,is_selected) | 定位一个元素并检查选中状态是否符合预期。is_selected是布尔值 |
element_located_to_be_selected(locator) | 等待选中locator参数元素 |
elemnet_selection_state_to_be(element, is_selected) | 判断element参数元素的选中状态是否符合预。is_selected参数为布尔值 |
element_to_be_clickable(locator) | 判断locator参数元素是否可点击(locator元素必须可见且可被使用) |
element_to_be_selected(element) | 判断element参数元素是否被选中(常用于下拉列表) |
invisibility_of_element_located(locator),invisibility_of_element(element) | 判断元素是否在DOM里不可见 |
presence_of_all_elements_located(locator) | 判断locator参数元素在DOM里至少有1个。返回值是最少1个元素的列表 |
presence_of_element_located(locator) | 判断locator参数元素是否在DOM里(locator元素不一定可见) |
text_to_be_present_in_element(locator, text) | 判断text参数是否在locator参数元素中 |
text_to_be_present_in_element_value(locator, text) | 判断text参数是否在locator参数元素的值中 |
visibility_of(element) | 判断element参数元素在DOM里可见且高和宽必须大于0 |
visibility_of_all_elements_located(locator) | 判断locator参数元素在DOM里可见且高和宽必须大于0(如果locator参数在DOM,返回WebElement列表) |
visibility_of_any_elements_located(locator) | 判断locator参数元素至少有一个在网页上可见(返回WebElement列表) |
visibility_of_element_located(locator) | 判断locator参数元素在DOM里可见且高和宽必须大于0 |
多窗口操作
新增窗口
- 使用方法:
变量.execute_script(‘window.open(“url”)’)
切换窗口
- 使用方法(共两种):
- 第一种方法:
变量.switch_to_window(变量.window_handles[index]) —— index参数是索引值,从0开始 - 第二种方法:
变量.switch_to.window(变量.window_handles[index])
- 第一种方法:
关闭窗口
- 使用方法:
变量.close() —— 关闭当前窗口,如果仅打开一个窗口则关闭浏览器
关闭浏览器
- 使用方法:
变量.quit() —— 关闭浏览器并退出驱动程序