selenium和webdriver

1.简介

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接调用浏览器,它支持所有主流的浏览器。我们可以使用selenium很容易完成之前编写的爬虫。webdriver可以理解它是浏览器的驱动。

selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

  • pip install selenium==3.141.0

  • 下载浏览器驱动程序:

    • https://registry.npmmirror.com/binary.html?path=chromedriver/&spm=a2c6h.24755359.0.0.1c384dccQ9PaJR

    • https://msedgewebdriverstorage.z22.web.core.windows.net/

      需要把相应的驱动放到python的编译环境下

    • edge的驱动需要换名字:MicrosoftWebDriver.exe

卸载已经安装的模块:pip uninstall 模块名

2. 浏览器对象

声明不同浏览器对象

from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
  • get(url=url) :地址栏输入url地址并确认
  • page_source :HTML结构源码
  • maximize_window():浏览器窗口最大化
  • quit():关闭浏览器
from selenium import webdriver

# 声明Chrome浏览器对象
browser = webdriver.Chrome()

# 请求页面 
browser.get('https://www.taobao.com')

print(browser.page_source)  # 获取网页源代码

# browser.close()  # 关闭当前页面

3. selenium定位元素

from selenium.webdriver.common.by import By

  • find_element(By.ID, '根据标签id属性进行定位')
  • find_element(By.NAME, '根据标签name属性进行定位')
  • find_element(By.CLASS_NAME, '根据标签class属性进行定位')
  • find_element(By.XPATH, '根据xpath语法进行定位')
  • find_element(By.CSS_SELECTOR, '根据css语法进行定位')
  • find_element(By.LINK_TEXT, '根据标签文本内容进行定位')
from selenium import webdriver 
from selenium.webdriver.common.by import By  #选择器

browser = webdriver.Chrome()
browser.get('https://taobao.com')

# 通过元素ID查找 
by_id = browser.find_element(By.ID,'q')
by_id.send_keys('美食')
print(by_id)

# 通过css选择器查找
css_select = browser.find_element(By.CSS_SELECTOR,'#q')
css_select.send_keys('美食')

# 通过xpath查找  
xpath = browser.find_element(By.XPATH,'//*[@id="q"]')
xpath.send_keys('美食')

# browser.close()

4. 无界面模式

from selenium import webdriver

options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)

5. 打开新窗口和切换页面

selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了

  • selenium中没有专门的打开新窗口的方法,是通过execute_script()来执行js脚本的形式来打开新窗口的。

    window.execute_script("window.open('https://www.douban.com/')")
    
  • 打开新的窗口后driver当前的页面依然还是之前的,如果想要获取新的窗口的源代码,那么就必须先切换过去。

    window.switch_to.window(driver.window_handles[1])
    
window:js的window对象
scrollTo:window的方法,可以滚到页面的任何位置
scrollHeight:是dom元素的通用属性,document.body.scrollHeight会返回body元素的高度,基本上就是页面的高度
scrollLeft:获取位于对象左边界和窗口目前可见内容的最左端之间的距离
scrollTop:获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
scrollWidth:获取对象滚动的宽度
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://news.baidu.com/')
time.sleep(2)

#滚动到浏览器底部
js = 'window.scrollTo(0,document.body.scrollHeight)'
driver.execute_script(js)  # 执行js代码
time.sleep(2)

# # #滚动到顶部
js = 'window.scrollTo(0,document.body.scrollTop=0)'
driver.execute_script(js)

6. selenium-iframe

网页中嵌套了网页,先切换到iframe,然后再执行其他操作

  • 切换到要处理的Frame

    browser.switch_to.frame(frame节点对象)
    
  • 在Frame中定位页面元素并进行操作

  • 返回当前处理的Frame的上一级页面或主页面

    # 返回上一级
    browser.switch_to.parent_frame()
    # 返回主页面
    browser.switch_to.default_content()
    

7. 操作cookie

  • 获取cookie:driver.get_cookies()
  • 根据cookie的key获取value:value = driver.get_cookie(key)
  • 删除所有的cookie:driver.delete_all_cookies()
  • 删除某个cookie:driver.delete_cookie(key)

8. 隐式等待和显式等待

  • 隐式等待:指定一个时间,在这个时间内一直会处于等待状态。隐式等待需要使用driver.implicitly_wait
  • 显式等待:指定在某个时间内,如果某个条件满足了,那么就不会再等待。显式等待用的方法是from selenium.webdriver.support.ui import WebDriverWait

9.上例子

from selenium import webdriver  # # 驱动浏览器
from selenium.webdriver.common.by import By  #选择器
from selenium.webdriver.common.keys import Keys   #按键
from selenium.webdriver.support.wait import WebDriverWait  #等待页面加载完毕,寻找某些元素
from selenium.webdriver.support import expected_conditions as EC  ##等待指定标签加载完毕

# 1,驱动浏览器
browser = webdriver.Chrome()  

# 2,请求页面   --返回的数据封装在了browser对象里,不需要额外的变量接收
browser.get('https://www.baidu.com')  #调用浏览器驱动访问站点

# 3,拿到输入框
# text_input = browser.find_element_by_id('kw') 
text_input = browser.find_element(By.ID,'kw') 

# 4,向输入框中写入内容
text_input.send_keys('爬虫')  

# 5,按下回车按钮 
text_input.send_keys(Keys.ENTER)

# 等待事件 -- 怕网速慢
wait = WebDriverWait(browser,100)  # 参数1:浏览器对象 参数2:时间(秒)
# 等待某元素出现 presence_of_element_located()传入的参数格式是一个元组
wait.until(EC.presence_of_element_located((By.ID,'result_tts_player')))

print(browser.current_url)  #查看url
print(browser.get_cookies())  #查看cookie
print(browser.page_source)  #查看源代码

browser.close()  # 关闭浏览器

你可能感兴趣的:(selenium,python,chrome)