selenium介绍
Selenium是广泛使用的模拟浏览器运行的库,它是一个用于Web自动化测试的工具。 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,并且支持大多数现代 Web 浏览器。
selenium使用
基础
# 导入模块
from selenium import webdriver
# 使用谷歌浏览器
chrome=webdriver.Chrome()
# 使用谷歌打开百度页面
chrome.get('https://www.baidu.com')
# 窗口最大化
chrome.maximize_window()
# 获取页面源代码
data=chrome.page_source
# 获取所有cookie
chrome.get_cookies()
# 获取窗口大小
chrome.get_window_size()
页面元素定位
find_element()根据指定的定位策略查询匹配到的第一个元素;find_elements()根据指定的定位策略查询匹配到的所有元素。
| 定位器 Locator(需要全部大写) | 描述 |
|---|---|
| class name | 定位class属性与搜索值匹配的元素(不允许使用复合类名) |
| css selector | 定位 CSS 选择器匹配的元素 |
| id | 定位 id 属性与搜索值匹配的元素 |
| name | 定位 name 属性与搜索值匹配的元素 |
| link text | 定位link text可视文本与搜索值完全匹配的锚元素(主要针对于a标签) |
| partial link text | 定位link text可视文本部分与搜索值部分匹配的锚点元素。如果匹配多个元素,则只选择第一个元素。(模糊link text定位) |
| tag name | 定位标签名称与搜索值匹配的元素 |
| xpath | 定位与 XPath 表达式匹配的元素 |
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get('https://www.baidu.com')
# 1、通过id值定位
driver.find_element(By.ID,"kw")
# 2、通过class值定位,想要拿到内容,需要遍历
driver.find_element(By.CLASS_NAME, 'cos-pc')
# 3、通过name定位
driver.find_element(By.NAME, "referrer")
# 4、通过tag_name定位
driver.find_element(By.TAG_NAME, "div")
# 5、通过XPATH语法定位
driver.find_element(By.XPATH, '//*[@id="kw"]')
# 6、通过css语法定位
driver.find_element(By.CSS,"#kw")
# 7、通过文本定位--精确定位
driver.find_element(By.LINK_TEXT,"在希望的田野上")
# 8、通过部分文本定位--模糊定位
print(driver.find_element(By.PARTIAL_LINK_TEXT, "田野上"))
案例1(起点小说网):
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver=webdriver.Chrome()
driver.get('https://www.qidian.com/rank/hotsales/')
#定位到小说标题
eles = driver.find_elements(By.CLASS_NAME,'book-mid-info') #法1:生成的是一个迭代器,找到class属性是book-mid-info的全部内容
eles = driver.find_elements(By.CSS_SELECTOR,'.book-mid-info') #法2
for i in eles:
print(i.find_element(By.XPATH,'./h2/a').text) #输出h2中的a标签的文本内容
# 定位到连接文本
# login = driver.find_element(By.ID,'login-btn') #法1
login = driver.find_element(By.CSS_SELECTOR,'#login-btn') #法2
# login = driver.find_element(By.LINK_TEXT,'登录') #法3
login.click()
time.sleep(3)
# 获取属性
img = driver.find_elements(By.XPATH,"//div[@class='book-img-box']/a/img") #注意find_elements拿到的是一个迭代器,find_element不是
for i in img:
print(i.get_attribute('src'))
案例2:
'''
定位到输入框
输入要搜索的文本
回车 / 点击搜索按钮
'''
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver=webdriver.Chrome()
driver.get('https://www.qidian.com/rank/hotsales/')
#定位到输入框
shuru=driver.find_element(By.CSS_SELECTOR,'.search-box')
#输入要搜索的文本
shuru.send_keys('三国演义')
time.sleep(3)
# shuru.clear() #清空输入框,再次输入 红楼梦
# time.sleep(3)
#
# shuru.send_keys('红楼梦')
# time.sleep(3)
#点击搜索按钮
dianji = driver.find_element(By.ID,'search-btn')
dianji.click()
time.sleep(3)
多窗口切换
- iframe切换
如果想要的数据在iframe标签中,则需要先switch_to.frame()切换到iframe标签中才能定位到数据,必须要切换才行。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
drive = webdriver.Chrome()
# 打开豆瓣
drive.get('https://www.douban.com/')
# 窗口最大化
drive.maximize_window()
# 切换到iframe标签
drive.switch_to.frame(0)
# 点击密码登录按钮
drive.find_element(By.CLASS_NAME,'account-tab-account').click()
# 定位到输入框
btn = drive.find_element(By.ID,'username')
btn.send_keys('12234354')
time.sleep(2)
# 定位到密码框
pwd = drive.find_element(By.ID,'password').send_keys('123456')
time.sleep(2)
- 页面切换
我们在访问网页的时候会打开很多个页面,如果要在多个页面中切换需要使用selenium提供的一些操作方法
switch_to.window():用于切换到对应的窗口。
# 多窗口切换
import time #强制等待
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建Chrom浏览器驱动
driver=webdriver.Chrome()
driver.get('http://douban.com')
time.sleep(3)
# 打开一个新的窗口
driver.execute_script('window.open()')
time.sleep(3)
# 切换到第二个窗口
driver.switch_to.window(driver.window_handles[1])
#打开淘宝
driver.get('http://taobao.com')
time.sleep(1)
# 打开第三个新的窗口
driver.execute_script('window.open()')
time.sleep(3)
# 切换到第二个窗口
driver.switch_to.window(driver.window_handles[1])
# 把第二个窗口变成京东
driver.get('http://jd.com')
time.sleep(2)
# 切换到第一个窗口
driver.switch_to.window(driver.window_handles[0])
# 打开百度首页
driver.get('http://www.baidu.com')
time.sleep(2)
selenium执行js语法
有时候selenium提供的方法会出现一些问题,或者执行起来非常麻烦,我们就可以考虑通过selenium执行javascript来实现,使复杂的操作简单化。 selenium执行js脚本的方法:
常见的js代码
#滚动页面(http://douban.com)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight/2)')
time.sleep(3)
driver.execute_script('window.scrollTo((document.body.scrollHeight/2),document.body.scrollHeight)')
time.sleep(3)
# js点击h(http://douban.com)
button = driver.find_element(By.XPATH,'//span[@class="bn"]/input') #先找到搜索框
button.click() #法1:通过selenium的点击实现,但不是每个网站都能实现,有些被js绑定了就不行
time.sleep(3)
# driver.execute_script("arguments[0].click();", button) #法2:找到之后再点击
# time.sleep(3)
# js = 'document.getElementById("su").click()' #法3:js中的点击,js中没有send_keys(http://www.baidu.com)
# driver.execute_script(js)
# 删除属性(http://www.baidu.com)
js = 'document.getElementById("su").removeAttribute("class")' #http://www.baidu.com
driver.execute_script(js)
time.sleep(2)
# 修改属性(http://www.baidu.com)
js = 'document.getElementById("su").setAttribute("style","background-color: yellow")'
driver.execute_script(js)
# 执行自定义JavaScript:使用execute_script方法可以执行您编写的任何自定义 JavaScript 代码,
# 以完成测试或自动化任务。(http://www.baidu.com)
driver.execute_script("console.log('Hello, world!');")
# 打开多窗口(http://www.douban.com)
driver.execute_script("window.open('https://www.baidu.com')")