首先,我们来了解一下selenium调用JS语句的优缺点。
优点:
1.不受页面前端显示限制。(例如有一些页面元素需要鼠标悬停在某处,或者页面比较长,需要移动内嵌拖动条)
2.可以直接修改页面的参数(把一些属性改变),包括对CSS,HTML元素的增,删,改,定位。
缺点:
1.需要学习JS语句才能使用
什么是JS语句
JS语句其实就是web页面的脚本语言;
示例:网页在一个新的窗口中打开
有些链接按钮在点击后不是在当前窗口跳转,而是打开一个新窗口,这是因为在链接的标签上带target属性;当target=_blank时,点击链接打开新窗口。
selenium不能在当前窗口操作其他窗口,需要进行切换窗口。
调用js语句可以去除target属性,让链接在当前窗口打开
先使用js的定位方法进行定位(类似selenium的定位)
getElementByClassName(),
getElementById(),
getElementsByName(),
getElementsByTagName()
进行定位后用removeAttribute(“target”)去除target属性
示例一
这是百度新闻里的一个链接,target是_blank
代码:
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(3)
driver.get(“http://news.baidu.com/tech“)
js = ‘document.getElementByClassName(“bold-item”).childNodes[0].removeAttribute(“target”)’
driver.execute_script(js)
driver.find_element_by_link_text(‘移动游戏市场同比增长近50% 疫情“宅经济”’).click()
分析:
对页面的元素、属性等进行增删改等操作,是调用JS语句才能实现的独特优势;
除此之外,还有一些selenium比较麻烦操作,例如:对iframe的富文本编辑器进行编辑,移动内嵌拖动条(上下和左右)等,调用JS语句都可以比较容易地实现。
示例二
对iframe的富文本编辑器进行内容编辑
js=’document.getElementById(“**“).contentWindow.document.body.innerHTML=” %s “ ‘ % jstext
分析:
使用selenium自带的方法,我们需要切换到iframe,再对iframe的body进行send_key操作,若使用js语句可以不切换到iframe,直接对富文本编辑器的内容进行操作
示例三
移动内嵌拖动条
上下移动:scrollTop,0为顶,10000为底部
js = ‘document.getElementsByClassName(“**“)[0].scrollTop=10000’
左右移动:scrollLeft,0为最左,10000为最右
js = ‘document.getElementsByClassName(“**“)[0].scrollLeft=10000’
分析:
对于窗口的拖动条,selenium可以使用ActionChains(driver).move_to_element(**).perform()
这个方法很方便使用
不过对于内嵌拖动条,selenium使用drag_and_drop_by_offset()方法与调用js语句相比,调用js语句的更加方便快捷,也更灵活
总结
在selenium中调用JS语句,可以实现一些不可替代的功能(对页面元素、属性进行增删改),也可以更灵活快捷地进行一些操作,对selenium自动化帮助还是挺大的。