selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了。
一种常见的场景当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的。这时候需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上。滚动条是无法直接用定位工具来定位的。selenium里面也没有直接的方法去控制滚动条,这时候只能借助JS了,在开发者调试工具控制台中JS操作示例如下
上述命令的意思是获取id值为nav_list的HTML元素,并获取其文本值。
有些特殊的操作selenium2+python无法直接完成的,JS刚好是这方面的强项,且selenium提供了一个操作js的方法,所以算是一个很好的补充(js脚本可以对当前页面(无论是否有滚动条或全屏展示)元素,都可以操作))。调用方法如下
execute_script(script, *args)
在当前窗口/框架 同步执行javaScript。括号中第一个script是str类型的JS脚步代码,第二个Arguments是该方法的参数同时也是JS脚步代码的参数。
常用示例如下
1、控制浏览器滚动条高度
#滚动条回到顶部
js="varq=document.documentElement.scrollTop=0"
driver.execute_script(js)
这里可以修改scrollTop的值,来控制右侧滚动条的位置,以上方法在Firefox上是可以的,但是用Chrome浏览器,发现不管用。于是用以下方法解决谷歌浏览器滚动条的问题。
js ="var q=document.body.scrollTop=0"
driver.execute_script(js)
若要对页面中的内嵌窗口中的滚动条进行操作,要先定位到该内嵌窗口,在进行滚动条操作
js="varq=document.getElementById('id').scrollTop=0"
driver.execute_script(js)
2、获取JS返回值
从javaScript代码中返回数据,我们需要使用return关键字。基于返回值的类型,我们需要对execute_script()方法进行转型。对于带小数点的值,使用Double类型,非小数值可以使用Long类型,布尔值可以使用Boolean类型,如果返回的是HTML节点,可以使用 WebElement类型;文本值,可以使用String类型。如果js处理后结果是列表形式,则返回结果可以直接用python列表的方法操作。
js="return
"+"window.document.getElementById('nav_list').text"
nav=driver.execute_script(js)
这时js语句中不应该出现var关键字及变量名了。直接返回语句。下列写法是错误的
js="return
"+" var txt=window.document.getElementById('nav_list').text"
nav=driver.execute_script(js)
js=" var txt=window.document.getElementById('nav_list').text;return
txt"
nav=driver.execute_script(js)
在引入变量做参数的时候,也别忘了参数要加引号,如
result_text=”开户申请提交成功”
result_js='return
'+'document.getElementById("applySuccess").innerText.includes("'+result_text+'")'
否则WebDriverException: Message: unknown error: 开户申请提交成功 is not defined。
由于使用js方法,执行速度比较快,页面也许没有完全加载,造成操作属性找不到的错误,如
WebDriverException: Message: unknownerror: Cannot read property 'innerText' of undefined
这时需要代码中增加显式等待。
3、给js传递参数
所传递的参数就是script执行时需要的参数,调用格式为
execute_script(script,参数1,参数2,参数3,…)
如
#实现给指定元素value赋新值
ele=driver.find_element_by_id('UserName')
printele
js="arguments[0].value=arguments[1]"printdriver.execute_script(js,ele,"100000000") #ele就是第一个参数,js执行代码中用arguments[0]引用,“10000000”就是第二个参数,代码中用arguments[1]引用