Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动
Selenium支持多种语言开发,比如 Java,C,Ruby,Python等等
#一个简单的小例子 from selenium import webdriver from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() #打开Chrom浏览器 browser.get('http://www.baidu.com') #输入百度的网址 即打开百度 input = browser.find_element_by_id('kw') #找到id=kw 即百度搜索输入框 #input = browser.find_element(By.ID,'kw') #同上 input.send_keys('Python') #在搜索输入框中输入Python input.send_keys(Keys.ENTER) #键入回车
#用例: 声明浏览器对象
#未安装则报错
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
查找元素
WebDriver 提供了许多寻找网页元素的方法,譬如 find_element_by_* 的方法。例如一个输入框可以通过 find_element_by_name 方法寻找 name 属性来确定。
对应于webdriver中的定位方法分别是: driver.find_element_by_name() ——最常用,简单 driver.find_element_by_id() ——最常用,简单 driver.find_element_by_class_name() driver.find_element_by_tag_name() ——最不靠谱 driver.find_element_by_link_text() ——定位文字连接好用 driver.find_element_by_partial_link_text() ——定位文字连接好用 driver.find_element_by_xpath() ——最灵活,万能 driver.find_element_by_css_selector() #这里的方法都可以写做 driver.find_element(by.___,'__ ')的方法 例如:driver.find_element(By.ID,'q') 这里需要调用 from selenium.webdriver.common.by import By 模块
注意:上边的都为单个元素的查找方法,若想查询多个元素需要将 element 换成 elements
prowser.page_source #获取网页渲染后的代码。这样就可以做到网页的动态爬取了。
元素交互操作
#一个简单的例子 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(3) input.clear() #清除输入框 input.send_keys('iPad') button = browser.find_element_by_class_name('btn-search') button.click()
元素拖拽
要完成元素的拖拽,首先你需要指定被拖动的元素和拖动目标元素,然后利用 ActionChains 类来实现
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') #找到id=draggable target = browser.find_element_by_css_selector('#droppable') #找到id=droppable actions = ActionChains(browser) actions.drag_and_drop(source,target) actions.perform()
这样就实现了元素从 source 拖动到 target 的操作。
执行JS 实现进度条下拉
from selenium import webdriver import time browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') element = browser.find_element_by_name('fullname') browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') #移动到页面最底部 time.sleep(5) #移动到元素element对象的“顶端”与当前窗口的“顶部”对齐 browser.execute_script("arguments[0].scrollIntoView();",element) time.sleep(5) browser.execute_script("window.scrollBy(0, 100)") #移动到指定的坐标(相对当前的坐标移动) time.sleep(5) browser.execute_script("window.scrollTo(0, 500)") #移动到窗口绝对位置坐标,如下移动到纵坐标1600像素位置 time.sleep(5) browser.execute_script("arguments[0].scrollIntoView(true)", element) time.sleep(5) #移动到元素element对象的“底端”与当前窗口的“底部”对齐 browser.execute_script("arguments[0].scrollIntoView(false)", element) time.sleep(5) browser.execute_script("window.scrollTo(0, 0);") #页面最顶端 browser.execute_script('alert("To Bottom")') #跳出警告框
获取ID,位置,标签名,大小,html代码
from selenium import webdriver browser = webdriver.Chrome() url = 'https://www.zhihu.com/explore' browser.get(url) input = browser.find_element_by_class_name('zu-top-add-question') print(input.id) print(input.location) print(input.tag_name) print(input.size) print(browser.page_source) #获取渲染后的html代码
等待操作
# 爬虫在执行的过程中,目标站可能会有一些ajax请求,它不会管你的页面是否加载成功(完全)
# 当页面加载不完全时,执行ajax可能就会报错,以导致程序出错, 所以我们需要使用等待操作
# 隐式等待: 当使用了隐式等待执行测试的时候,如果WebDriver没有在DOM中找到元素,将继续等待,
# 超出设定时间后则抛出找不到元素的异常,也就是说,当查找元素或元素并没有立即出现时,
# 隐式等待将等待一段时间再查找DOM,默认的时间是 0
#隐形操作 from selenium import webdriver browser = webdriver.Chrome() browser.implicitly_wait(10) browser.get('https://www.zhihu.com/explore') input = browser.find_element_by_class_name('zu-top-add-question') print(input) browser.close()
# 显式等待(比较常用) # 在指定时间内,判断条件是否成立, 如果成立立即返回 # 如果不成立,就会一直等待, 如果仍不满足条件, 抛出异常 # 用例: 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 browser = webdriver.Chrome() browser.get('https://www.taobao.com') wait = WebDriverWait(browser, 10) input = wait.until(EC.presence_of_element_located((By.ID, 'q'))) button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search'))) print(input, button) browser.close()
一些判断条件
# title_is 标题是否是某内容 # title_contains 标题是否包含某内容 # presence_of_element_located 元素加载出,传输定位元素,如(By.ID,'p') # visibility_of_element_located 元素可见,传入定位元组 # visibility_of 可见,传入元素对象 # presence_of_all_elements_located 所有元素加载出 # text_to_be_present_in_element 某个元素文本包含某文字 # text_to_be_present_in_element_value 某个元素值包含某文字 # frame_to_be_available_and_switch_to_it frame加载并切换 # invisibility_of_element_located 元素不可见 # element_to_be_clickable 元素可点击 # staleness_of 判断一个元素是否仍在DOM,可判断页面是否已刷新 # element_to_be_selected 元素可选择,传元素对象 # element_located_to_be_selected 元素可选择,传入定位元组 # element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False # element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False # alert_is_present 是否出现Alert
浏览器控制
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.get('https://www.taobao.com') browser.get('https://python.org') browser.back() #后退 time.sleep(2) browser.forward() browser.close()
插入cookies
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'jim'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies())
标签页管理
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.execute_script('window.open()') print(browser.window_handles) browser.switch_to_window(browser.window_handles[1]) browser.get('https://www.taobao.com') time.sleep(2) browser.switch_to_window(browser.window_handles[0]) browser.get('https://www.python.org')
异常处理
# 异常处理: # 在浏览器中的异常处理是比较麻烦的,因为浏览器可能触发的异常是非常多的 # 比如说,某个元素无法点击的异常, 加载超时的异常, 某个元素的执行异常等等 # 这里用了简单的例子来说明异常 # 这里还是建议要读官方的文档. # 用例: selenium 异常处理 from selenium import webdriver from selenium.common.exceptions import TimeoutException,NoSuchElementException browser = webdriver.Chrome() try: browser.get('https://www.baidu.com') except TimeoutException: print('Time Out!!') try: browser.find_element_by_id('hello') except NoSuchElemention: print('No Element') finally: browser.close()
小白笔记 如有错误 请提醒修改