【月更23】通过简书网学习 ActionChains,selenium webdriver 学习第3篇

举报
梦想橡皮擦 发表于 2022/03/28 09:43:17 2022/03/28
【摘要】 本篇博客学习 selenium webdriver 控制窗口句柄,以及模拟鼠标键盘操作等内容。 控制 BOSS 直聘网站窗口句柄本次先通过 BOSS 直聘网进行测试,打开网站首页的头图。切换句柄,用到的核心函数是 driver.switch_to.window(all_handles[0]),其中 all_handlers 为列表类型,在很多博客中,你会看到被废弃的方法 switch_to_...

本篇博客学习 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_downkey_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()  # 点击阅读更多

记录时间

今天是持续写作的第 280 / 365 天。
可以关注我,点赞我、评论我、收藏我啦。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。