selenium使用(一)

36 阅读4分钟

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点击hhttp://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()'  #法3js中的点击,js中没有send_keyshttp://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')")