- Selenium是一个用于web应用程序测试的工具。
- Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
- Selenium支持通过各种driver(FirfoxDriver,IternetExplorerDriver,ChromeDriver)驱动真实浏览器完成测试。
- Selenium支持无界面浏览器操作。
模拟浏览器功能,自动执行网页中的js代码,实现动态加载。
- 谷歌浏览器驱动下载地址
http://chromedriver.storage.googleapis.com/index.html
http://npm.taobao.org/mirrors/chromedriver/
按照chrome版本对应的driver,直接按照浏览器版本去找对应的driver(只对应大版本就行)。
- 查看谷歌浏览器版本
谷歌浏览器右上角‐‐>帮助‐‐>关于 Chrome
- selenium安装
pip install selenium
- 确认selenium是否安装成功
pip show selenium
# 查看Selenium.Webdriver支持哪些浏览器
from selenium import webdriver
help(webdriver)
执行结果:
Help on package selenium.webdriver in selenium:
NAME
selenium.webdriver
PACKAGE CONTENTS
chrome (package)
chromium (package)
common (package)
edge (package)
firefox (package)
ie (package)
remote (package)
safari (package)
support (package)
webkitgtk (package)
wpewebkit (package)
从结果中,可以看出常见的浏览器基本都支持。
- 导入模块
from selenium import webdriver
- 创建谷歌浏览器操作对象
path = 谷歌浏览器驱动文件路径
browser = webdriver.Chrome(path)
- 访问网址
url = 要访问的网址
browser.get(url)
- page_source 获取网页源码
content = browser.page_source
print(content)
- 关闭浏览器
browser.close()
# 案例:
from selenium import webdriver
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.baidu.com'
browser.get(url)
content = browser.page_source
print(content)
browser.close()
元素定位:自动化要做的就是模拟鼠标和键盘来操作来操作这些元素,点击、输入等等。操作这些元素前首先
要找到它们,WebDriver提供很多定位元素的方法。
注:通过webdriver对象的find_element_by_xx(" "),在selenium的4.0版本中此种用法已经抛弃。
方法1:通过webdriver对象的find_element("属性名","属性值")
# 案例:
from selenium import webdriver
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.baidu.com'
browser.get(url)
# 根据id来查找对象
button = browser.find_element('id','su')
print(button)
# 根据name来查找对象
button = browser.find_element('name','wd')
print(button)
# 根据xpath来查找对象
button = browser.find_element('xpath','//input[@id="su"]')
print(button)
方法2:通过webdriver模块中的By,以指定方式定位元素
导入模块:from selenium.webdriver.common.by import By
# 案例:
from selenium import webdriver
from selenium.webdriver.common.by import By
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.baidu.com'
browser.get(url)
# 根据By.TAG_NAME来查找对象
button = browser.find_element(By.TAG_NAME,'input')
print(button)
# 使用bs4的语法来获取对象
button = browser.find_element(By.CSS_SELECTOR,'#su')
print(button)
# 根据By.LINK_TEXT来查找对象
button = browser.find_element(By.LINK_TEXT,'新闻')
print(button)
# 访问元素信息
1.获取元素属性
.get_attribute('class')
2.获取元素文本
.text
3.获取标签名
.tag_name
# 案例1:
from selenium import webdriver
from selenium.webdriver.common.by import By
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.baidu.com'
browser.get(url)
input = browser.find_element(By.ID,'su')
# 获取元素属性
print(input.get_attribute('class'))
# 获取标签名
print(input.tag_name)
input = browser.find_element(By.LINK_TEXT,'新闻')
# 获取元素文本
print(input.text)
# 案例2:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
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')
print(source)
try:
logo = browser.find_element(By.CLASS_NAME,'logo')
except NoSuchElementException:
print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element(By.CLASS_NAME,'logo')
print(logo)
print(logo.text)
点击:click()
输入:send_keys()
后退操作:browser.back()
前进操作:browser.forword()
模拟JS滚动:
js='document.documentElement.scrollTop=100000'
browser.execute_script(js) 执行js代码
获取网页代码:page_source
退出:browser.quit()
# 案例1:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.baidu.com'
browser.get(url)
time.sleep(2)
input = browser.find_element(By.ID,'kw')
input.send_keys('周杰伦')
time.sleep(2)
button = browser.find_element(By.ID,'su')
button.click()
time.sleep(2)
# 滑到底部
js_bottom = 'document.documentElement.scrollTop=100000'
browser.execute_script(js_bottom)
time.sleep(2)
# 获取下一页按钮
next = browser.find_element(By.XPATH,'//a[@class="n"]')
next.click()
time.sleep(2)
# 返回上一页
browser.back()
time.sleep(2)
# 回到下一页
browser.forward()
time.sleep(2)
# 退出
browser.quit()
# 案例2:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get("http://www.taobao.com")
input_str = browser.find_element(By.ID,'q')
input_str.send_keys("ipad")
time.sleep(2)
input_str.clear()
input_str.send_keys("MakBook pro")
button = browser.find_element(By.CLASS_NAME,'btn-search')
button.click()
运行的结果可以看出程序会自动打开Chrome浏览器并打开淘宝输入ipad,然后删除,重新输入MakBook pro,并点击搜索。
# 案例3:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
Chrome-headless模式,Google针对Chrome浏览器59版新增加的一种模式,可以让你不打开UI界面的情况下使用Chrome浏览器,所以运行效果与Chrome保持完美一致。
1.系统要求:
Chrome
Unix\Linux 系统需要 chrome >= 59
Windows 系统需要 chrome >= 60
Python3.6
Selenium==3.4.*
ChromeDriver==2.31
2.配置封装
from selenium import webdriver
# 这个是浏览器自带的,不需要再做额外的操作
from selenium.webdriver.chrome.options import Options
def share_browser():
# 初始化
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# path是自己的chrome浏览器的文件路径
path = r'C:\Users\95423\AppData\Local\Google\Chrome\Application\chrome.exe'
chrome_options.binary_location = path
# 创建对象
browser = webdriver.Chrome(chrome_options= chrome_options)
return browser
# 封装调用:
browser= share_browser()
#发起访问
browser.get('https://www.baidu.com/')
# 拍摄快照
browser.save_screenshot('baidu.png')
通过执行js命令实现新开选项卡window.open()
不同的选项卡是存在列表里browser.window_handles
通过browser.window_handles[0]就可以操作第一个选项卡
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(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
from selenium import webdriver
from selenium.webdriver.common.by import By
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 NoSuchElementException:
print('No Element')
finally:
browser.close()
参考链接:https://selenium-python.readthedocs.io/installation.html#installing-python-bindings-for-selenium