目录
1. 安装
2. 测试
3. 无头浏览器
4. 元素定位
5. 页面滑动
6. 按键、填写登录表单
7. 页面切换
Selenium是Web的自动化测试工具,为网站自动化测试而开发,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载界面,获取需要的数据,页面截屏。
1. 安装
浏览器:谷歌、火狐、Edge,这些浏览器的内核都是google
打开浏览器设置,查看浏览器版本
打开chromedriver下载网页,选择一个和浏览器内核版本最接近的一个版本:CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?path=chromedriver/点击进入,此处以windows环境为示例:
下载安装包,并解压这个文件,得到这个exe文件
如果你是使用PyCharm自带的Python解释器,那么你需要将这个文件放入你的PyCharm文件的bin目录下,例如:C:\...\PyCharm Community Edition 2022.1.3\bin
如果你是通过PyCharm使用Anaconda虚拟环境,那么你需要将这个文件放入你的Anaconda文件的Scripts目录下,例如:C:\...\Anaconda3\Scripts
添加环境变量,如果你已经是使用过PyCharm的用户,那么你的PyCharm大概率是已经添加进入环境变量了,此时你不用再添加环境变量
2. 测试
写一个访问浏览器页面的测试代码,首先下载selenium模块
from selenium import webdriver
import time
# 这两个方法二选一,webdriver.Chrome()会真的打开一个浏览器
# driver = webdriver.PhantomJS()
driver = webdriver.Chrome()
# 访问浏览器网址
driver.get('https://www.douban.com/')
# 截图保存图片
driver.save_screenshot("首页.png")
# 页面停留时间
time.sleep(5)
# 退出当前页面
driver.close()
# 退出浏览器
driver.quit()
运行成功会打开浏览器豆瓣首页网址并停留5秒,拿到首页截图。
3. 无头浏览器
无头浏览器不会打开浏览器页面,但会访问网页,适用于Linux环境
最新的selenium已经放弃了Phantomjs,直接将无头浏览器的逻辑进行了整合
from selenium import webdriver
# 无头
from selenium.webdriver.chrome.options import Options
# 配置参数
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")
# 把参数配置给浏览器
driver = webdriver.Chrome(options=opt)
driver.get("https://www.douban.com/")
driver.save_screenshot("./selenium_test/首页1.png")
driver.close()
driver.quit()
4. 元素定位
from selenium import webdriver
import time
from lxml import etree
# 无头
from selenium.webdriver.chrome.options import Options
# 元素定位
from selenium.webdriver.common.by import By
# 配置参数
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")
# 把参数配置给浏览器
driver = webdriver.Chrome(options=opt)
driver.get("https://book.douban.com/")
# 截屏当前页面
driver.save_screenshot("./selenium_test/tv.png")
# 获取前端代码
test = driver.page_source
# print(test)
# html = etree.HTML(test)
# xpath_result = html.xpath('//*[@id="content"]/div/div[1]/div[1]/div[2]/div[1]/div/ul[2]/li')
# print(xpath_result)
# print(len(xpath_result))
# for i in xpath_result:
# print(i.xpath('.//div[@class="info"]//a/@title'))
# 元素定位
xpath_result = driver.find_element(By.XPATH, '//*[@id="content"]/div/div[1]/div[1]/div[2]/div[1]/div/ul[2]/li[1]')
print(xpath_result)
print(xpath_result.text)
time.sleep(3)
driver.close()
driver.quit()
5. 页面滑动
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https:/www.douban.com/")
time.sleep(2)
js = 'window.scrollTo(0, 10000)' # 向下滑
# js = 'window.scrollTo(10000, 0)' # 向左滑
# js = 'window.scrollTo(10000, 10000)' # 向左并向下滑
driver.execute_script(js)
time.sleep(2) # 向上海
js = 'window.scrollTo(0, -10000)'
driver.execute_script(js)
time.sleep(5)
driver.close()
driver.quit()
6. 按键、填写登录表单
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
try:
driver.get('https://book.douban.com/')
time.sleep(3)
btn = driver.find_element(By.LINK_TEXT, '登录/注册')
btn.click()
# url = driver.current_url
# driver.get(url)
driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
time.sleep(2)
# 填写登录表单
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys('12345678')
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys('202125DOUBAN')
time.sleep(2)
driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
time.sleep(10)
driver.close()
driver.quit()
except:
print(Exception)
7. 页面切换
不同的网站有不同的应有场景,有些网站不会新生成页面,有些网站可以自动跳转
from selenium import webdriver
from selenium.webdriver.common.by import By
from lxml import etree
import time
url = 'https://www.bilibili.com/'
driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source
html = etree.HTML(html)
href = html.xpath('//*[@id="i_cecream"]/div[2]/main/div[2]/div/div[1]/div[5]/div/div[2]/a/@href')
print(href)
time.sleep(3)
driver.find_element(By.XPATH, '//*[@id="i_cecream"]/div[2]/main/div[2]/div/div[1]/div[5]/div/div[2]/a').click()
time.sleep(3)
# 获取当前所有窗口
current_windows = driver.window_handles
# 根据窗口索引进行切换
driver.switch_to.window(current_windows[0]) # 从 0 下标开始
time.sleep(3)
driver.close()
time.sleep(3)
driver.quit()