当然,我们也可以直接用find_elements()方法来选择,这时可以这样写:
1
|
lis = browser.find_elements(By.CSS_SELECTOR, '.service-bd li' ) |
结果是完全一致的。
6. 节点交互
Selenium可以驱动浏览器来执行一些操作,也就是说可以让浏览器模拟执行一些动作。比较常见的用法有:输入文字时用send_keys()方法,清空文字时用clear()方法,点击按钮时用click()方法。示例如下:
1
2
3
4
5
6
7
8
9
10
11
|
from selenium import webdriver import time browser = webdriver.Chrome() browser.get( 'https://www.taobao.com' ) input = browser.find_element_by_id( 'q' ) input.send_keys( 'iPhone' ) time.sleep(1) input.clear() input.send_keys( 'iPad' ) button = browser.find_element_by_class_name( 'btn-search' ) button.click() |
这里首先驱动浏览器打开淘宝,然后用find_element_by_id()方法获取输入框,然后用send_keys()方法输入iPhone文字,等待一秒后用clear()方法清空输入框,再次调用send_keys()方法输入iPad文字,之后再用find_element_by_class_name()方法获取搜索按钮,最后调用click()方法完成搜索动作。
通过上面的方法,我们就完成了一些常见节点的动作操作,更多的操作可以参见官方文档的交互动作介绍:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement。
7. 动作链
在上面的实例中,一些交互动作都是针对某个节点执行的。比如,对于输入框,我们就调用它的输入文字和清空文字方法;对于按钮,就调用它的点击方法。其实,还有另外一些操作,它们没有特定的执行对象,比如鼠标拖曳、键盘按键等,这些动作用另一种方式来执行,那就是动作链。
比如,现在实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处,可以这样实现:
1
2
3
4
5
6
7
8
9
10
11
|
from selenium import webdriver from selenium.webdriver import ActionChains browser = webdriver.Chrome() url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame( 'iframeResult' ) source = browser.find_element_by_css_selector( '#draggable' ) target = browser.find_element_by_css_selector( '#droppable' ) actions = ActionChains(browser) actions.drag_and_drop(source, target) actions.perform() |
首先,打开网页中的一个拖曳实例,然后依次选中要拖曳的节点和拖曳到的目标节点,接着声明ActionChains对象并将其赋值为actions变量,然后通过调用actions变量的drag_and_drop()方法,再调用perform()方法执行动作,此时就完成了拖曳操作,如图7-4和图7-5所示。
图7-4 拖曳前的页面
图7-5 拖曳后的页面
更多的动作链操作可以参考官方文档:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains。
8. 执行JavaScript
对于某些操作,Selenium API并没有提供。比如,下拉进度条,它可以直接模拟运行JavaScript,此时使用execute_script()方法即可实现,代码如下:
1
2
3
4
5
|
from selenium import webdriver browser = webdriver.Chrome() browser.get( 'https://www.zhihu.com/explore' ) browser.execute_script( 'window.scrollTo(0, document.body.scrollHeight)' ) browser.execute_script( 'alert("To Bottom")' ) |