首先,我们来了解一下selenium调用JS语句的优缺点。
序列号 | CPU | RAM | HDD | 带宽 | 售价(美元) | 免费试用 |
---|---|---|---|---|---|---|
香港服务器1 | E5-2620 | 32G | 1T HDD | 50M/无限流量 | $196.00 | 立即申请 |
香港服务器2 | E5-2650 | 32G | 1T HDD | 50M/无限流量 | $256.00 | 立即申请 |
香港服务器3 | E5-2680 | 32G | 1T HDD | 50M/无限流量 | $316.00 | 立即申请 |
香港服务器4 | E5-2690 | 32G | 1T HDD | 50M/无限流量 | $336.00 | 立即申请 |
香港服务器5 | E5-2697 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器6 | E5-2620*2 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器7 | E5-2650*2 | 32G | 1T HDD | 50M/无限流量 | $436.00 | 立即申请 |
香港服务器8 | E5-2680*2 | 32G | 1T HDD | 50M/无限流量 | $476.00 | 立即申请 |
香港服务器9 | E5-2690*2 | 32G | 1T HDD | 50M/无限流量 | $556.00 | 立即申请 |
香港服务器10 | E5-2697*2 | 32G | 1T HDD | 50M/无限流量 | $596.00 | 立即申请 |
香港服务器11 | E5-2680v4*2 | 32G | 1T HDD | 50M/无限流量 | $696.00 | 立即申请 |
香港服务器12 | E5-2698v4*2 | 32G | 1T HDD | 50M/无限流量 | $796.00 | 立即申请 |
优点:
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自动化帮助还是挺大的。