鼠标行为链
有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。
actions = ActionChains(driver) actions.move_to_element(inputTag) actions.send_keys_to_element(inputTag,'python') actions.move_to_element(submitTag) actions.context_click() actions.click(submitTag) actions.perform()
还有更多的鼠标相关的操作
-
click_and_hold(element):点击但不松开鼠标。
-
context_click(element):右键点击。
-
double_click(element):双击。
-
更多方法请参考:7. WebDriver API --- Selenium Python Bindings 2 documentation
练习
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By import time # 加载驱动 driver = webdriver.Chrome() # 拿到目标url driver.get("https://www.baidu.com") # 定位百度的输入框 inputtag = driver.find_element(By.ID, "kw") # 定位百度按钮 buttontag = driver.find_element(By.ID, "su") # 实例化一个鼠标行为链的对象 actions = ActionChains(driver) # 在已经定位好的输入框输入内容 actions.send_keys_to_element(inputtag, "python") # 等待一秒 time.sleep(1) # 第一种方法 # buttontag.click() # # 注意你用的逻辑操作和鼠标行为链没有相关 那么这些个操作需要放到perform()的外面 # # 第二种方法 在鼠标行为链中进行操作 没有问题 # actions.move_to_element(buttontag) # actions.click(buttontag) # # 提交行为链的操作 # actions.perform()
Cookie操作
- 获取所有的cookie
cookies = driver.get_cookies()
- 根据cookie的name获取cookie
value = driver.get_cookie(name)
- 删除某个cookie
driver.delete_cookie('key')
selenium携带cookie登录qq空间
登录接口
https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=https%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html&pt_no_auth=0
代码实现
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time
from selenium.webdriver.common.by import By
import requests
import json
模拟登录QQ空间
加载驱动
driver = webdriver.Chrome()
driver.get(
定位头像图片
img_tag = driver.find_element(By.CLASS_NAME,'face')
img_tag.click()
time.sleep(2)
获取cookie
cookie = driver.get_cookies() # 返回的是一个列表
print(cookie, type(cookie))
------------------------------------------------------------------------------------------------
通过循环打印这个cookie 发现它是一个列表 然后里面放的是字典格式的数据
for i in cookie:
print(i,type(i))
cookie = [item['name'] + '=' + item['value'] for item in cookie]
print(cookie)
cookie_str = '; '.join(cookie)
print(cookie_str, type(cookie_str))
time.sleep(3)
目标url
url = 'https://user.qzone.qq.com/3180929868'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
'cookie': cookie_str
}
res = requests.get(url, headers=headers)
time.sleep(1)
with open('空间.html', 'w', encoding='utf-8') as f:
f.write(res.text)
print(res.text)
页面等待
现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。
- 隐式等待:调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒中的时间
driver.implicitly_wait(10)
- 显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成
案例综合使用
from selenium import webdriver from selenium.webdriver.common.by import By import time # 加载驱动 driver = webdriver.Chrome() # driver.get('https://www.baidu.com/') # 定位到输入框 # input_tag = driver.find_element_by_id('kw').send_keys('python') ''' python自带的time模块去进行等待 相当于阻塞当前线程5秒。不建议过多使用,会严重影响脚本的性能。 ''' # time.sleep(3) # 3秒为强制休息时间 低于三秒浪费了时间--->爬取效率变低 ''' 隐式等待 只要找到元素就会立即执行 如果找不到才会等待10秒 好处: 只需设置一次,全局都生效。如果超时时间内网页完成了全部加载, 则立即进行下面的操作。比sleep()智能很多。 劣势: 隐式等待需要等到网页所有元素都加载完成才会执行下面的操作, 如果我需要操作的元素提前加载好了,但是其他无关紧要的元素还没有加载完成, 那么还是需要浪费时间去等待其他元素加载完成。 ''' # driver.implicitly_wait(10) # 10秒 # # 定位到百度一下的按钮 # but_tag = driver.find_element_by_id('su') # but_tag.click() ''' 显式等待 指定某个条件,然后设置最长等待时间。 如果在这个时间还没有找到元素,那么便会抛出异常,只有当条件满足时才会执行后面的代码。 好处: 解决了隐式等待的不足之处。 缺点: 缺点是稍微复杂一些,需要有一些学习成本。 ''' ''' 需要用到的库 ''' from selenium.webdriver.support import expected_conditions as EC # 核心 from selenium.webdriver.support.ui import WebDriverWait # 核心 from selenium.webdriver.common.by import By driver.get("https://www.baidu.com/") try: element = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.XPATH, '//*[@id="su"]')) ) text = driver.page_source print("text", text) finally: driver.quit()
一些其他的等待条件
-
presence_of_element_located:某个元素已经加载完毕了。
-
presence_of_all_elements_located:网页中所有满足条件的元素都加载完毕了。
-
element_to_be_clickable:某个元素是可以点击了。
更多条件请参考:5. Waits --- Selenium Python Bindings 2 documentation