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

网友投稿 869 2022-05-28

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

记录时间

今天是持续写作的第

280

/ 365 天。

可以

关注

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

我,

我、

评论

我、

我啦。

Selenium

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:上来就问MySQL事务,瑟瑟发抖...
下一篇:通过简书网学习 ActionChains,selenium webdriver 学习第3篇
相关文章