selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行
JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转
、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
Selenium提供了一下方法来定义一个页面中的元素:
find_element_by_id
find_element_by_name
find_element_by_xpath #根据xpath选取
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector #根据css选择器选取
下面是查找多个元素(这些方法将返回一个列表):
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
find_element_by_css_selector
查id find_element_by_css_selector(#id)
查class find_element_by_css_selector(.class)
查tag find_element_by_css_selector(tag)
selenium获取其他属性方法
get_attribute
获取文字 find_element_by_css_selector('#setf').get_attribute('textContent')
获取innerhtml find_element_by_css_selector('#setf').get_attribute('innerHTML')
获取连接地址 find_element_by_css_selector('#setf').get_attribute('href')
交互
send_keys() 输入文字
clear() 清空文字
click() 点击动作
执行JavaScript
Selenium API并没有提供。比如,下拉进度条,它可以直接模拟运行JavaScript,
此时使用execute_script()
方法即可实现
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("123")')
动作链
实例中,一些交互动作都是针对某个节点执行的。比如,对于输入框,我们就调用它的输入文字和清空文字方法;
对于按钮,就调用它的点击方法。其实,还有另外一些操作,它们没有特定的执行对象,比如鼠标拖曳、键盘按键等,
这些动作用另一种方式来执行,那就是动作链。
比如,现在实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处,可以这样实现:
from selenium import webdriver from selenium.webdriver import ActionChains import time 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.click_and_hold(source) time.sleep(3) for i in range(5): actions.move_by_offset(xoffset=17,yoffset=0).perform() time.sleep(0.5) actions.release()