selenium文档: https://selenium-python-zh.readthedocs.io/en/latest/
selenium安装: pip install selenium (不行就加上 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com)
使用示例:
from selenium import webdriver from selenium.webdriver.common.keys import Keys # Keys模拟按键操作 # 配置浏览器 chrome_options = webdriver.ChromeOptions() # "--headless" 无头浏览 chrome_options.add_argument("--headless") #不加载图片 prefs = {"profile.managed_default_content_settings.images": 2} chrome_options.add_experimental_option("prefs", prefs) # 创建Chrome Webdriver实例 driver = webdriver.Chrome(chrome_options=chrome_options) driver.get("http://www.python.org") assert "Python" in driver.title elem = driver.find_element_by_name("q") # 先清除内容 elem.clear() # 相当于输入"pycon" elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found" in driver.page_source # quit将关闭整个浏览器,而close只会关闭一个标签页, 如果你只打开了一个标签页,大多数浏览器的默认行为是关闭浏览器;运行结束必须quit driver.close() driver.quit()1、页面交互
打开页面:
url="https://www.baidu.com/" # 打开页面 driver.get(url) # 在浏览历史中前进或者后退 driver.forward() driver.back()获取当前页面截图:
driver.save_screenshot('screenshot.png')获取元素:
# 可以通过已知的id/name/xpath element = driver.find_element_by_id("kw") element = driver.find_element_by_name("wd") # 使用Xpath只返回查找到的第一个,若没有查找到抛出``NoSuchElementException``异常 element = driver.find_element_by_xpath("//input[@class='s_ipt']")输入搜索的关键词:
element.clear() element.send_keys("selenium文档") # Keys.ENTER 按ernter键 element.send_keys(Keys.ENTER) # 提交 找到最近的表单,返回提交它。 如果调用的元素不再表单内,将会抛出``NoSuchElementException``异常: element.submit()处理SELECT元素:
from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('name')) select.select_by_index(index) select.select_by_visible_text("text") select.select_by_value(value) # 取消所有选择 select.deselect_all() # 获得所有已选的选项 all_selected_options = select.all_selected_options # 获得所有选项 options = select.options提交表单:
driver.find_element_by_id("submit").click()拖放:
element = driver.find_element_by_name("source") target = driver.find_element_by_name("target") # ActionChains 处理鼠标相关操作 from selenium.webdriver import ActionChains action_chains = ActionChains(driver) action_chains.drag_and_drop(element, target).perform()切换不同的窗口:
# 当前的窗口名 driver.title # driver.switch_to_window("windowName") 已经过期了改成.switch_to.window() driver.switch_to.window("windowName") # 查看所有窗口名 windows = driver.window_handles for i in windows: # driver.switch_to_window(i) driver.switch_to.window(i) print(driver.title) # 通过索引切换 windows = driver.window_handles # driver.switch_to.window(windows[-1]) driver.switch_to.window(windows[-1])切换不同的frame:
driver.switch_to_frame("frameName") # 切换子frame driver.switch_to_frame("frameName.0.child") # 返回父frame driver.switch_to_default_content()访问弹出的对话框:
alert = driver.switch_to_alert()操作cookie:
# 获取cookie driver.get_cookies() # 添加cookie driver.add_cookie({'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BDSVRTM'}) # 删除指定cookie driver.delete_cookie("CookieName") # 删除所有cookie driver.delete_all_cookies()2、查找元素
在一个页面中有很多不同的策略可以定位一个元素。Selenium提供了下列的方法:
find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text (通过链接文本获取超链接) find_element_by_partial_link_text (通过链接文本获取超链接) find_element_by_tag_name (通过标签名查找元素,h1、p、a标签这些的) find_element_by_class_name find_element_by_css_selector
一次查找多个元素 (这些方法会返回一个list列表):
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 和 find_elements 。 用法示例:
from selenium.webdriver.common.by import By driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button')下面是 By 类的一些可用属性:
ID = “id” XPATH = “xpath” LINK_TEXT = “link text” PARTIAL_LINK_TEXT = “partial link text” NAME = “name” TAG_NAME = “tag name” CLASS_NAME = “class name” CSS_SELECTOR = “css selector”
找不到元素时,抛出NoSuchElementException 异常。
通过链接文本获取超链接:
<a href="continue.html">Continue</a>continue_link = driver.find_element_by_link_text(‘Continue’) continue_link = driver.find_element_by_partial_link_text(‘Conti’)
通过css选择器查找元素:
<p class="content">Site content goes here.</p>content = driver.find_element_by_css_selector(‘p.content’)
3、等待页面加载 元素不再页面之中,会抛出 ElementNotVisibleException 异常。 (1) 显式等待 等待指定的条件满足时再执行代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC 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() # 在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息) WebDriverWait()后有until(self, method, message)和until_not(self, method, mesage)两种方法
(2)隐式等待 等待一定时间后再开始查找元素,driver.implicitly_wait() 如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步
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"(杂): Selenium之动作链(ActionChains) 用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供了一个类来处理这类事件——ActionChains 方法可以用.连接, 比如ActionChains().move_to_element(元素).click(元素).perform()
driver.execute_script(css_selector % keyword) 执行js
‘–ignore - ssl - errors’ 忽略ssl错误 ‘–ssl - protocol = TLSv1’ ssl协议使用TLSv1 chrome_options.add_argument(“service_args = [’–ignore - ssl - errors = true’, ‘–ssl - protocol = TLSv1’]”) self.driver.execute_script("$(’#mobile’).val(%s)" % self.phone) # 填写phone 分辨率设置 影响获取可见元素
driver.close() 必须关闭driver, driver.quit(), 否则还会有很多残留的缓存chrome/driver, lsof|grep chrome或driver|cut -c 11-15|xargs kill 清理缓存lsof|grep deleted|cut -c 11-15|xargs kill