网页视频抓取脚本(1.为什么需要JS前面3篇文章讲了一些基本操作的方法)
优采云 发布时间: 2021-12-13 20:29网页视频抓取脚本(1.为什么需要JS前面3篇文章讲了一些基本操作的方法)
1. 为什么我们需要JS
前面3篇文章讲了Selenium的一些基本操作。使用这部分技巧,可以顺利完成网站的大部分自动化。
但是,有一些网站 web操作使用WebDriver API无法完成,有些功能即使使用WebDriver API实现也不兼容。经常需要维护这组脚本,比如浏览器的位置。滑动、元素点击失效、日期选择等。
这时候使用JavaScript直接操作网页内部元素,可以帮助我们完成Selenium自动化测试无法覆盖的功能。
2. 使用方法
Selenium 提供了以下方法:
driver.execute_script(js_code)
其中,js_code是一个JS脚本。常见的JS脚本包括:设置元素属性、移除属性、设置元素值、设置窗口位置等。
使用 Selenium CSS Selector 类型,使用 JS 查找元素的方式包括以下 6 种类型:
# 1、通过元素id属性,获取元素
document.getElementById('id');
# 2、通过元素name属性,获取元素
document.getElementsByName('name');
# 3、通过标签名,获取元素列表
# 获取的是一个列表
document.getElementsByTagName('tag_name');
# 4、通过类名,获取元素列表
document.getElementsByClassName("class_name");
# 5、通过选择器,获取一个元素
document.querySelector("css selector")
# 6、通过CSS选择器,获取元素列表
document.querySelectorAll("css selector")
获取元素后,可以操作元素属性,例如:
# 操作属性值
# 设置元素某一个元素值
element.setAttribute('属性名','属性值')
# 设置元素值
element.value="element_value";
# 删除属性
element.removeAttribute('属性名')
结合以上3个操作,就可以通过JS改变一个网页元素的值了。
# 待执行的js语句
exec_js = 'document.getElementById(element_id).value="element_value";'
# 执行js语句改变元素的值
driver.execute_script(exec_js)
3. 常用操作
以12306网站为例,选择出发日期。
先用普通模式写一波自动化,用WebDriver查找元素,然后直接给元素设置一个日期值。
运行后直接报错,运行日志会提示目标元素有不可编辑的属性-只读
这时候就可以通过JS的方法方便的去掉这个属性,然后再添加元素的属性操作,就可以正常设置日期了。
改写后的代码如下:
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.12306.cn/index/')
# 去除掉元素的属性
exec_js = 'document.getElementById("train_date").removeAttribute("readonly");'
driver.execute_script(exec_js)
# 输入日期
element_train_date = driver.find_element_by_id("train_date")
element_train_date.clear()
element_train_date.send_keys("2012-12-12")
sleep(5)
driver.quit()
当然,除了去除元素属性之外,还可以使用JS搜索元素语法来获取目标元素,然后直接在元素上设置一个日期,也可以满足我们的需求。
# 找到元素,直接设置一个容器
exec_js = 'document.getElementById("train_date").value="2012-12-12";'
# 执行js代码
driver.execute_script(exec_js)
4. 其他
Selenium 自动化的很多操作都可以转成JS 语句,然后使用execute_script() 来完成同样的功能。
但是在自动化的实际使用中,JS只是作为一个补充,帮助我们完成一些WebDriver无法实现的功能。