在Selenium中,使用ActionChains动作链处理元素非常有用,而且可以省去放置元素的麻烦。 但是,这里面也有不小心踩了洞的时候。 请特别注意使用名为click的函数。 否则,不会“点击”预期的元素。
来吧,看看案例。
被检页面: https://log in.Sina.com.cn/sign up/sign up? 输入=家庭页面
测试需求:
在元素对齐方式下,单击“新闻”复选框。click (函数中的“娱乐”复选框),通过在ActionChains中模拟按键盘上的选项卡键将焦点切换到“娱乐”复选框
代码运行现象描述:
在元素放置方法中,已正确选中“新闻”复选框【】使用ActionChains方法运行时,“娱乐”复选框未被选中,“新闻”复选框将被清除
代码如下:
fromseleniumimportwebdriverfromselenium.webdriverimportactionchainsfromselenium.web driver.com mon.keysimportkeys #火狐布拉新浪注册页面driver.get ) ' https://log in.Sina.com.cn/sign up/sign up? entry=来自home page浏览器开发人员工具的“新闻”复选框中的CSS选择器路径news _ CSS='.checkls tlabel 3360 nth-child (1)输入: nth-child . find _ element _ by _ CSS _ selector (news _ CSS ) #单击“新闻”复选框,获取初始聚焦位置CK_news.click(# ),然后单击
发现问题了吗? 在ActionChains行动链中,click ()函数并没有按照我们的想法运行!
尝试剪切click函数的部分源码
位置 libsite -包 seleniumweb drivercommonaction _ chains.py
需要注意一些:
此函数具有默认参数on_element,默认值为None; 如果传递了页面元素,请单击此页面元素。 如果指定的元素无法到达,请单击当前焦点元素。
上面的代码没有传递click函数的参数。 也就是说,您正在单击当前页面的焦点元素。 那么,当前页面的焦点要素是哪个?
让我们继续从源代码中阅读一个名为ActionChains的类的说明:
class ActionChains(object):。 。
生成用户操作。
whenyoucallmethodsforactionsontheactionchainsobject,
theactionsarestoredinaqueueintheactionchainsobject。
When you call perform (,theeventsarefiredintheorderthey
Are队列上电。
明白了吧。 只有在调用名为perform ()的函数时,才会顺序执行先前编写的一系列操作链。
也就是说:
在ActionChains语句之前,焦点位于名为“新闻”的复选框中。 在运行perform ()之前,焦点位置位于名为“新闻”的复选框中。 运行perform ()之前的click ) )操作也是焦点元素“新闻”的单击操作,因此不仅没有选中“娱乐”,而且已经选中的“新闻”也会被检出
看看接下来怎么解决吧。 总体思路是断开前面的动作链,使点击操作独立。
更改前的错误代码:
actionchains(driver ).move_to_element ) CK_news ).send_keys ) keys.tab ).click ).(性能参数)
更改后的代码:
actionchains(driver ).move_to_element ) CK_news ).send_keys ) keys.tab ).perform ) actionchains ) de
更改后分析:
当模拟按下选项卡时,perform立即运行,当前焦点元素的位置(新闻)实际发生了变化,定位于以下元素(娱乐) : 在switch_to操作中,导航到当前的活动(焦点)元素,即“娱乐”复选框。 在这种情况下,执行“单击”单击操作即可。
附加最终代码:
fromseleniumimportwebdriverfromselenium.webdriverimportactionchainsfromselenium.web driver.com mon.keysimportkeys #火狐布拉新浪注册页面driver.get ) ' https://log in.Sina.com.cn/sign up/sign up? entry=来自home page浏览器开发人员工具的“新闻”复选框中的CSS选择器路径news _ CSS='.checkls tlabel 3360 nth-child (1)输入: nth-child r.find _ element _ by _ CSS _ selector (news _ CSS ) #单击“新闻”复选框,获取初始聚焦位置ck_news.click (),然后单击焦点元素切换actionchains(driver ).move_to_element的send_keys(keys.tab ).perform )按顺序提供操作链转至焦点元素(娱乐) -单击-运行)作用)单击最新的焦点元素actionchains (驱动程序) _move_to_eller