该文档用于记录平时项目,接单所用到的各种selenium api。

引入库

1
2
3
4
5
6
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

打开

1
2
3
4
5
6
7
8
9
10
11
chrome_path='./chromedriver.exe'
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-logging'])#禁止打印日志
option.add_experimental_option('excludeSwitches', ['enable-automation'])#实现了规避监测
# option.add_argument('--headless') #无头
# option.add_argument('--disable-gpu') #不使用GPU渲染图像
option.add_argument('log-level=3') #不显示无用的警告
option.add_argument("--window-size=1920,1080") #设置窗口大小
driver = webdriver.Chrome(options=option,executable_path=chrome_path)
driver.maximize_window() #窗口最大化

其他的配置设置

1
2
3
4
5
6
7
option.add_argument("--no-sandbox") #减少资源占用

prefs = {'profile.managed_default_content_settings.images': 2}
option.add_experimental_option('prefs',prefs)#不加载图片

prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': file_path}
option.add_experimental_option('prefs', prefs)# 设定浏览器下载文件后保存的位置

定位方法

1
2
3
4
5
6
driver.find_element_by_id("kw").send_keys("selenium")#通过id方式定位
driver.find_element_by_name("wd").send_keys("selenium")#通过name方式定位
driver.find_element_by_tag_name("input").send_keys("selenium")#通过tag name 方式定位
driver.find_element_by_class_name("s_ipt").send_keys("selenium")#通过class_name方式定位
driver.find_element_by_css_selector("#kw").send_keys("selenium")#通过css方式定位
driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")#通过 xpath方式定位

上述方法将element改为elements则可以定位多个控件

隐性等待

1
2
wait = WebDriverWait(driver, 6)
wait.until(EC.presence_of_element_located((By.XPATH, '//*[@_nk="hu7r11"]')))

保存cookie和载入cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if not os.path.exists("login.json"):
driver.get('https://www.qyyjt.cn/')
# handles = driver.window_handles#获取当前浏览器的所有标签页
# driver.switch_to_window(handles[-1])#定位到第二个标签页
xx=input('手动登录以后按回车')
dictCookies = driver.get_cookies() # 核心
print(dictCookies)
jsonCookies = json.dumps(dictCookies)
print(jsonCookies)
# 登录完成后将cookie保存到本地文件
with open('login.json','w') as f:
f.write(jsonCookies)
def load_cookies(driver):
with open('login.json','r',encoding='utf8') as f:
listCookies = json.loads(f.read())

for cookie in listCookies:
driver.add_cookie(cookie)
return driver

定位标签页

1
2
handles = driver.window_handles #获取当前浏览器的所有标签页
driver.switch_to_window(handles[1])#定位到第二个标签页

滑动页面到指定元素上

1
2
choose_page2=driver.find_elements_by_xpath('//*[@id="lpBloc"]/li')
driver.execute_script("arguments[0].scrollIntoView();", choose_page2[-1])

webdriver 的各种操作方法

方法 说明
set_window_size() 设置浏览器的大小
back() 控制浏览器后退
forward() 控制浏览器前进
refresh() 刷新当前页面
clear() 清除文本
send_keys (value) 模拟按键输入
click() 单击元素
submit() 用于提交表单
get_attribute(name) 获取元素属性值
is_displayed() 设置该元素是否用户可见
size 返回元素的尺寸
text 获取元素的文本
get() 打开网址
quit() 退出并关闭webdriver

鼠标操作

方法 说明
ActionChains(driver) 构造ActionChains对象
context_click() 执行鼠标悬停操作
move_to_element(above) 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element(above) 执行鼠标悬停操作
context_click() 用于模拟鼠标右键操作, 在调用时需要指定元素定位
perform() 执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作

使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from selenium import webdriver
#1.引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
#2.定位到要悬停的元素
element= driver.find_element_by_link_text("设置")
#3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(element).perform()
#找到链接
elem1=driver.find_element_by_link_text("搜索设置")
elem1.click()
#通过元素选择器找到id=sh_2,并点击设置
elem2=driver.find_element_by_id("sh_1")
elem2.click()
#保存设置
elem3=driver.find_element_by_class_name("prefpanelgo")
elem3.click()

下拉框

1
from selenium.webdriver.support.select import Select
方法 说明
select_by_value(“选择值”) select标签的value属性的值
select_by_index(“索引值”) 下拉框的索引
select_by_visible_testx(“文本值”) 下拉框的文本值

使用方法:

1
2
sel = driver.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50') # 显示50条

截图

1
driver.get_screenshot_as_file("D:\\baidu_img.jpg")