快速使用
pip3 install Selenium
快速demo
chromedriver需要到该网站下载 http://www.seleniumhq.org/download/
driver = webdriver.Chrome('./chromedriver') driver.get('http://www.baidu.com') assert '百度' in driver.title elem = driver.find_element_by_name('wd') elem.clear() elem.send_keys('网络爬虫') # 搜索框填充 elem.send_keys(Keys.RETURN) # 回车 time.sleep(3) assert '网络' not in driver.page_source driver.close()
元素选取
还可以通过 find_element 和 find_elements 来查找指定元素
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '// button[text()="Some text"]')
第一个参数还可以取值:
By.ID, By.XPATH, By.LINK_TEXT, By.PARTIAL_LINK_TEXT, By.NAME, By.TAG_NAME, By.CLASS_NAME, ·By.CSS_SELECTOR
下拉选项卡
from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_xpath('// form/select ')) select.select_by_index(index) select.select_by_visible_text("text") select.select_by_value(value)
可以根据索引、文字、value值来选择选项卡中的某一项。
如果select标记中multiple=“multiple”,也就是说这个select标记支持多选,Select对象提供了支持此功能的方法和属性。示例如下:
·取消所有的选项:select.deselect_all()
·获取所有的选项:select.options
·获取已选中的选项:select.all_selected_options
元素拖拽
将一个元素拖到另外一个元素的位置,类似拼图
elem = driver.find_element_by_name('source') # 源元素 target = driver.find_element_by_name('target') # 目的元素 from selenium.webdriver import ActionChains action_chains = ActionChains(driver) action_chains.drag_and_drop(elem, target).perform()
窗口和页面切换
一个浏览器一般都会开多个窗口,我们可以switch_to_window实现指定窗口切换
driver.switch_to_window('windowname')
通过window handle获取每个窗口的对象
for handle in driver.window_handles: driver.switch_to_window(handle)
切换页面frame
driver.switch_to_frame('frameName')
弹窗处理
alert = driver.switch_to_alert() alert.dismiss()
前进后退
alert = driver.switch_to_alert() alert.dismiss()
Cookie处理
driver.get('http://www.baidu.com') cookie = {'name': 'foo', 'value': 'bar'} # driver.get_cookies() driver.add_cookie(cookie)
设置phantomJS请求头user-agent
from selenium.webdriver import DesiredCapabilities dcap = dict(DesiredCapabilities.PHANTOMJS) dcap["phantomjs.page.settings.userAgent"] = ( "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36", ) driver = webdriver.PhantomJS() # desired_capabilities=dcap) driver.get("http://www.google.com") driver.quit()
等待
由于很多网站采取ajax技术, 不确定网页什么时候加载完全。无法提取元素。所以需要等待
显示等待
显式等待是一种条件触发式的等待方式,指定某一条件直到这个条件成立时才会继续执行,可以设置超时时间,如果超过这个时间元素依然没被加载,就会抛出异常
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit()
加载页面定位 myDynamicElement 元素,设置超时时间10s, WebDriverWait默认会500ms检测一下元素是否存在
Selenium提供了一些内置的用于显式等待的方法,位于expected_conditions类中
隐式等待
隐式等待是在尝试发现某个元素的时候,如果没能立刻发现,就等待固定长度的时间,类似于socket超时,默认设置是0秒。一旦设置隐式等待时间,它的作用范围是Webdriver对象实例的整个生命周期,也就是说Webdriver执行每条命令的超时时间都是如此
from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement")
线程休眠
time.sleep() 比较常用