selenium动作链
今天是美好的周六,一大早起来学习了,今天学的是selenium里的动作链(ActionChains),特别好玩,我一定要好好学这个模块。
这个我们用到的页面是菜鸟编程里的实例,目的是将图中的可拖拽的方块移动到容器中,现在来具体实现一下。这个应该可以应用于滑动验证码的验证
首先,我们还是要先导入模块
代码语言:javascript复制from selenium import webdriver
from selenium.webdriver import ActionChains
from time import sleep
接着,我们要实例化一个浏览器对象
代码语言:javascript复制bro = webdriver.Chrome(executable_path="chromedriver.exe")
然后要对我们指定的url进行访问,使用get方法来实现
代码语言:javascript复制bro.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
此时,我们需要定位到标签,就是可拖拽对象的标签,我们打开检查,可以看到他的标签所在。
这个时候我们再用上次的方法去直接定位元素,发现是会报错的,因为他嵌套在了一个iframe标签中。
首先,什么是iframe呢:
“IFRAME是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)<iframe> 标签规定一个内联框架。一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。”
也就是说,我们想要找的标签被iframe标签嵌套了,所以我们要用别的方法来提取标签,当然selenium中的方法可以做到。
代码语言:javascript复制"""
如果标签是嵌套在iframe标签里的,则无法用find...的方法定位到,下面的一行会报错
div = bro.find_element_by_id("draggable")
调用switch方法,参数为嵌套标签的iframe标签的id属性值,
切换浏览器标签定位的作用域,记得别漏了frame!!
"""
bro.switch_to.frame("iframeResult")
div = bro.find_element_by_id("draggable")
OK,现在标签已经定位到了,可以对他添加动作链了,让他帮我们完成一系列的动作。
首先是创建一个实例,将我们的浏览器实例作为对象传入,然后再对我们的标签进行动作设置。
动作思路是:我们要将小方块拖拽到一个容器中,那就要点击并长按这可拖拽对象(div),然后向右拖动一些像素值,最后松开点击。
代码语言:javascript复制# 创建一个Action实例
action = ActionChains(bro)
# 点击并长按指定的标签
action.click_and_hold(div)
接下来是要开始拖拽了,为了更清楚的看见效果,做了一个循环并且在每次拖拽完停顿一小会。
代码语言:javascript复制for i in range(5):
# 方法move_by_offset(soffset,yoffset)
action.move_by_offset(17, 0).perform()
sleep(0.3)
# 释放动作
action.release()
sleep(3)
# 最后还要自动关闭浏览器
bro.quit()
接下来就来看看效果叭!全程都是他自动操作的,我不需要动鼠标
重新贴上完整的代码:
代码语言:javascript复制from selenium import webdriver
from selenium.webdriver import ActionChains
from time import sleep
bro = webdriver.Chrome(executable_path="chromedriver.exe")
bro.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
"""
如果标签是嵌套在iframe标签里的,则无法用find定位到,下面的一行会报错
div = bro.find_element_by_id("draggable")
调用switch方法,参数为嵌套标签的iframe标签的id属性值,
切换浏览器标签定位的作用域,记得别漏了frame!!
"""
bro.switch_to.frame("iframeResult")
div = bro.find_element_by_id("draggable")
print(div)
# 动作链
# 创建一个Action实例
action = ActionChains(bro)
# 点击并长按指定的标签
action.click_and_hold(div)
for i in range(5):
# 方法move_by_offset(soffset,yoffset)
action.move_by_offset(17, 0).perform()
sleep(0.3)
# 释放动作
action.release()
sleep(3)
bro.quit()