Selenium

来源:互联网 发布:北京用友软件代理商 编辑:程序博客网 时间:2024/06/07 13:55

Selenium 崔老师爬虫系列课程学习笔记

自动化测试工具,支持多种浏览器。
爬虫中主要用来解决JavaSript的渲染问题
当通过requests和urllib库无法获得网页内容,这个时候可以用Selenium库来模拟浏览器

安装

pip install selenium

基本使用

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitbrowser = webdriver.Chrome()#声明浏览器对象try:    browser.get('http://www.baidu.com')# 传入网址    input = browser.find_element_by_id('kw')#找出id为kw的元素    input.send_keys('Python')# 像元素中发送python字符串    input.send_keys(Keys.ENTER)# 传入Enter键    wait = WebDriverWait(browser,10)    wait.until(EC.presence_of_element_located((By.ID,'content_left')))    print(browser.current_url)#打出此时的url    print(browser.get_cookies)#打印出cookies    print(browser.page_source)#打印出源代码finally:    browser.close()

声明浏览器对象

        from selenium import webdriverbrowserser = webdriver.Chrome()browser = webdriver.Firefox()browser = webdriver.Edge()browser = webdriver.PhantomJS()

访问页面

from selenium import webdriverbrowser = webdriver.Chrome()browser.get('https://www.taobao.com')print(browser.page_source())

查找元素

单个元素

from selenium import webdriverbrowser = webdriver.Chrome()browser.get('http://www.taobao.com')input_first = browser.find_element_by_id('q')input_second = browser.find_element_by_css_selector('#q')input_third = browser.find_element_by_xpath('//*[@id="q"]')print(input_first,input_second,input_third)

find_element_by_name

find_element_by_xpath

find_element_by_link_text

find_element_by_tag_name

find_element_by_class_name

find_element_by_css_selector

from selenium import webdriverfrom selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()browser.get('https://www.taobao.com')input_first = browser.find_element(By.ID,'q')print(input_first)#browser.close()

多个元素

from selenium import webdriverbrowser = webdriver.Chrome()browser.get('https://www.taobao.com')lis = browser.find_elements_by_css_selector('.service-bd li')print(lis)
from selenium import webdriverfrom selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()browser.get('https://www.taobao.com')lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')print(lis)

元素交互操作

from selenium import webdriverimport timebrowser = 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()

交互动作

将动作附加到动作链中串行执行

from selenium import webdriverfrom selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'browser.get(url)#请求一个urlbrowser.switch_to.frame('iframeResult')#切换到一个framesource = 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()

更多动作:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

执行JavaScript

from selenium import webdriverbrowser = webdriver.Chrome()browser.get('https://www.zhihu.com/explore')browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')browser.execute_script('alert("to bottom")')

获取元素信息

获取属性

from selenium import webdriverfrom selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()url = 'https://www.zhihu.com/explore'browser.get(url)logo = browser.find_element_by_id('zh-top-link-logo')print(logo)print(logo.get_attribute('class'))

获取文本值

from selenium import webdriverbrowser = webdriver.Chrome()url = ('https://www.zhihu.com/explore')browser.get(url)input = browser.find_element_by_class_name('zu-top-add-question')print(input.text)
提问

获取ID、位置、标签名、大小

from selenium import webdriverbrowser = 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)

Frame

from selenium import webdriverbrowser = 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')print(source)try:    logo = browser.find_elememt_by_class_name('logo')except Exception:    print('NoLogo')browser.switch_to.parent_frame()logo = browser.find_element_by_class_name('logo')print(logo)print(logo.text)    

等待

隐式等待

当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常, 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0

from selenium import webdriverbrowser = 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.text)
提问

显式等待

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECbrowser = 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)

详细内容:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

前进后退

import timefrom selenium import webdriverbrowser = webdriver.Chrome()browser.get('https://www.baidu.com/')browser.get('https://www.taobao.com/')browser.get('https://www.python.org/')browser.back()time.sleep(9)browser.forward()browser.close()

Cookies

from selenium import webdriverbrowser = webdriver.Chrome()browser.get('https://www.zhihu.com/explore')print(browser.get_cookies())browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})print(browser.get_cookies())browser.delete_all_cookies()print(browser.get_cookies())

选项卡管理

import timefrom selenium import webdriverbrowser= webdriver.Chrome()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(5)browser.switch_to_window(browser.window_handles[0])browser.get('https://python.org')

异常处理

from selenium import webdriverfrom selenium.common.exceptions import TimeoutException, NoSuchElementExceptionbrowser = webdriver.Chrome()try:    browser.get('https://www.baidu.com')except TimeoutException:    print('Time Out')try:    browser.find_element_by_id('hello')except NoSuchElementException:    print('No Element')finally:    browser.close()

详细文档:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions

原创粉丝点击