本篇博客学习 selenium webdriver
控制窗口句柄,以及模拟鼠标键盘操作等内容。
控制 BOSS 直聘网站窗口句柄
本次先通过 BOSS 直聘网进行测试,打开网站首页的头图。
切换句柄,用到的核心函数是 driver.switch_to.window(all_handles[0])
,其中 all_handlers
为列表类型,在很多博客中,你会看到被废弃的方法 switch_to_window
,需要留意一下。
使用 driver.current_window_handle
可以获取当前窗口句柄。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.zhipin.com/?ka=header-home")
locator = (By.CLASS_NAME, 'firstRow')
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator))
except TimeoutError as e:
print(e)
btn = driver.find_elements_by_css_selector('tr.firstRow td:nth-child(1)>a')[0]
btn.click() # 打开一个新选项卡窗口
all_handles = driver.window_handles # 获取所有窗口句柄
print(all_handles)
driver.switch_to.window(all_handles[0]) # 切换到首页句柄
与 switch_to.window
函数相似功能的还有 switch_to.frame()
方法、switch_to.alert
属性,这里这个 alert
属性非常有趣,可以捕获到网页弹窗,测试代码如下:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://www.zhipin.com/?ka=header-home")
locator = (By.CLASS_NAME, 'firstRow')
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator))
except TimeoutError as e:
print(e)
btn = driver.find_elements_by_css_selector('tr.firstRow td:nth-child(1)>a')[0]
btn.click() # 打开一个新选项卡窗口
all_handles = driver.window_handles # 获取所有窗口句柄
driver.switch_to.window(all_handles[0]) # 切换到首页句柄
time.sleep(2)
js = "alert('提示弹窗')" # js 代码
driver.execute_script(js) # 执行JS
alt = driver.switch_to.alert # 捕获网页弹窗
print(alt.text) # 打印弹窗文本
最终输出弹窗文本,【提示弹窗】。
与 switch_to.frame()
配合使用的还有两个方法需要学习,分别是跳转父级窗口 driver.switch_to.parent_frame()
,跳转回默认页 driver.switch_to.default_content()
。
通过简书网学习 ActionChains
ActionChains 称为动作链,主要用于模拟鼠标操作,例如单击、双击、右键、拖拽,也可以操作键盘,例如按键按下与松开。
使用前需要导入相关类:
from selenium.webdriver.common.action_chains import ActionChains # 导入模块
需要注意当我们调用 ActionChains 的方法之后,它不会立即执行,他会把所有操作都放在一个队列中,当我们调用 perform()
方法之后,队列依次执行。
下面实现第一个功能,打开简书,点击导航栏中的 IT 技术选项卡。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains # 导入模块
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.jianshu.com/") # 打开简书
it = driver.find_element_by_link_text("IT技术") # 找到所在标签
ActionChains(driver).click(it).perform() # 点击所在标签
接下来用 ActionChains 实现简书首页的阅读更多操作,下述代码有个位置需要移动两次鼠标,为了让阅读更多首次加载,可以使用运行 JS 代码实现。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains # 导入模块
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.jianshu.com/") # 打开简书
# 下述代码用于找到阅读更多
change = driver.find_element_by_link_text("涂檬-原创插画社区")
ActionChains(driver).move_to_element(change).move_to_element(change).perform()
more = driver.find_element_by_link_text("阅读更多")
ActionChains(driver).move_to_element(more).click(more).perform() # 点击阅读更多
ActionChains 更多方法如下所示:
关于鼠标
-
click(on_element=None)
:普通单击; -
click_and_hold(on_element=None)
:按住左键不松开; -
context_click(on_element=None)
:右击; -
double_click(on_element=None)
:双击; -
drag_and_drop(source, target)
:拖动某个元素到目标元素; -
drag_and_drop_by_offset(source, xoffset, yoffset)
:拖拽某个元素到某个坐标; -
move_by_offset(xoffset, yoffset)
:移动鼠标到某个位置; -
move_to_element(to_element)
:移动鼠标到某个元素; -
move_to_element_with_offset(to_element, xoffset, yoffset)
:移动鼠标到 距某个元素(左上角坐标)指定的位置; -
release(on_element=None)
:释放鼠标左键。
关于键盘 -
send_keys(*keys_to_send)
:发送内容到当前焦点的元素; -
send_keys_to_element(element, *keys_to_send)
:发送内容到指定元素; -
key_down(value, element=None)
: 按下某个键盘上的键; -
key_up(value, element=None)
:松开某个键。
下面实现打开简书,向搜索框输入数据,然后点击查询的动作链操作。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains # 导入模块
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.jianshu.com/") # 打开简书
search_box = driver.find_element_by_id("q") # 搜索框
# print(search_box)
search_btn = driver.find_element_by_class_name('search-btn') # 搜索按钮
ActionChains(driver).send_keys_to_element(search_box, "梦想橡皮擦").move_to_element(search_btn).click(search_btn).perform()
学习了 key_down
与 key_up
方法之后,可以配合 Keys
类,实现对简书的如下控制,通过下拉滚动条实现【阅读更多】操作。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains # 导入模块
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.jianshu.com/") # 打开简书
# 模拟按下键盘上下键 500 次
for i in range(500):
ActionChains(driver).key_down(Keys.DOWN).key_up(Keys.DOWN).perform()
more = driver.find_element_by_link_text("阅读更多")
ActionChains(driver).move_to_element(more).click(more).perform() # 点击阅读更多
记录时间
今天是持续写作的第 <font color=red>280</font> / 365 天。
可以<font color=#04a9f4>关注</font>我,<font color=#04a9f4>点赞</font>我、<font color=#04a9f4>评论</font>我、<font color=#04a9f4>收藏</font>我啦。
更多精彩
网友评论