Selenium 中提供了很多定位元素、操作元素的方法,但是由于网页的开发形态各种各样,所以难免有些需求满足不了。当 Selenium 无法操作的情况下,就需要通过 JavaScript 来辅助了。
在 WebDriver 中提供了执行 JavaScript 的方法:execute_script(script, *args)
,JavaScript 代码以字符串的形式构建,然后传给该方法执行。
参数说明:
- script: 以字符串形式构建的 JavaScript 代码;
- *args: 以可变参数形式接收参数,并将参数传递给 JavaScript 代码。在 JavaScript 代码中会以数组
arguments
来接收 execute_script() 方法传递的参数。
执行脚本
比如,我们可以通过 JavaScript 来实现窗口滚动。
window.scroll(0, 500) // 将当前窗口滚动到坐标 0,500 位置
使用 execute_script() 来执行:
driver.execute_script('window.scroll(0, arguments[0])', 500)
注意,我们传入了一个参数 500, 在 JavaScript 代码中使用 arguments[0] 去接收该值。如果你传入了两个值:
driver.execute_script('window.scroll(arguments[0], arguments[1])', 100, 500)
理解到了吧?就是通过下标方式依次取值。
获取返回值
如果你想获取 JavaScript 代码中的返回值,可以在 JavaScript 代码中增加 return 语句。
下面的代码可以获取百度按钮的值:“百度一下”:
document.getElementById('su').getAttribute('value')
我们通过 execute_script() 去调用,并获取到值用于后续的自动化代码:
js = "document.getElementById('su').getAttribute('value')"
value = driver.execute_script("return %s" % js)
## 百度一下
通过在你需要返回的语句前加一个 return,就可以获取到 JavaScript 代码执行后的数据。
简单案例
类似京东的网站,采用了动态渲染技术,一次性不会加载整个页面,当你拖动时会逐步加载内容。这种类型的网站,如果你想操作的元素恰好在最底部,也就是需要拖动到最后才能操作的话。可以使用 JavaScript 实现滚动。
import time
def scroll(driver):
h = 0
while h != driver.find_element_by_tag_name('body').size.get('height'):
# 滚动到当前显示内容的最下端
driver.execute_script('window.scroll(0, arguments[0])', h)
# 等待页面加载
time.sleep(1)
# 如果加载之后,最下端的高度没有变化则说明到底了
h = driver.find_element_by_tag_name('body').size.get('height')