Python 浏览器自动化测试框架:Selenium 二
Python 浏览器自动化测试框架:Selenium 二
前一段时间介绍过一点Selenium库,拥有强大的功能!今天我来进一步的介绍一下Selenium模拟用户浏览器的一些操作。
这段时间学习更新频率明显慢下来了,身体出现了一点小问题吧,还有部分原因是难度的增大吧,总之会努力回到最好的状态的!
元素定位
在进行一下操作是比如单击某个按钮时要找到该元素的位置,这点和爬虫的解析库一样。Selenium提供了多种,
- find_element_by_id
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_css_selector
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
前面的小案例中就利用find_elements_by_name
来寻找搜索框的位置,当元素较少是,可以使用name定位。当使用场景更加复杂的时候,通常还是会使用Xpath和Css选择器来实现。
实现按键功能
前面的小案例中已经,用send_keys
实现了输入回车的功能,
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Chrome()
browser.get("http://baidu.vnos.cn/")
# 判断标题中是否包含该字符串
assert "WDNMD!不会百度么?" in browser.title
# 查找name=text的节点
element = browser.find_element_by_name("text")
# 清空原有的输入,输入python进行搜索
element.clear()
#出入查找内容
element.send_keys("饮水楞伽")
#输入回车
element.send_keys(Keys.RETURN)
# 判断是否有结果返回
assert "No results found." not in browser.page_source
# 关闭当前标签,也可以使用quit()关闭浏览器
browser.close()
其中部分代码:
from selenium.webdriver.common.keys import Keys
element.send_keys("饮水楞伽")
element.send_keys(Keys.RETURN)
在Selenium库中利用send_keys
可以实现很多按键操作如
- 键盘F1到F12:send_keys(Keys.F1) 把F1改成对应的快捷键
- 复制Ctrl+C:send_keys(Keys.CONTROL,"c")
- 粘贴Ctrl+V:send_keys(Keys.CONTROL,"v")
- 全选Ctrl+A:send_keys(Keys.CONTROL,"a")
- 剪切Ctrl+X:send_keys(Keys.CONTROL,"x")
- 制表键Tab: send_keys(Keys.TAB)
示例:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
time.sleep(1)
browser.find_element_by_id("kw").send_keys("浮生四海")
# 在搜索框中输入"浮生四海"
browser.find_element_by_id("kw").send_keys(Keys.SPACE)
# 输入空格键
time.sleep(1)
browser.find_element_by_id("kw").send_keys("饮水楞伽")
# 在搜索框中输入"饮水楞伽"
browser.find_element_by_id("kw").send_keys(Keys.CONTROL, "a")
# 输入Control+a模拟全选
browser.find_element_by_id("kw").send_keys(Keys.CONTROL, "c")
# 输入Control+c模拟复制
browser.find_element_by_id("kw").send_keys(Keys.CONTROL, "v")
# 输入Control+v模拟粘贴
browser.find_element_by_id("kw").clear()
# 清空搜索框
time.sleep(1)
browser.find_element_by_id("kw").send_keys(Keys.CONTROL, "v")
# 输入Control+v模拟粘贴
browser.find_element_by_id("kw").send_keys(Keys.ENTER)
#输入回车代替点击搜索按钮
实现鼠标点击
在进行页面操作时,需要用鼠标进行左键点击、右键点击、双击、鼠标悬浮(比如鼠标移到某个位置就会出现一些元素)、鼠标拖动等操作,这时需要导入ActionChains模块
- perform() 执行所有ActionChains 中存储的行为
- click_and_hold(element)左键点击
- context_click(elem) 右击
- double_click(elem) 双击
- drag_and_drop(source,target) 拖动
- move_to_element(elem) 鼠标悬停
示例:
from selenium import webbrowser
from selenium.webbrowser import ActionChains
#创建浏览器对象
browser = webbrowser.Chrome()
browser.get("http://www.baidu.com")
action1 = browser.find_element_by_css_selector("#su")
ActionChains(browser).move_to_element(action1).perform()
# 鼠标移动到搜索框按钮
action2 = browser.find_element_by_css_selector("#su")
ActionChains(browser).move_to_element(action2).click(action2).perform()
# 鼠标移动到搜索按钮并单击
action3 = browser.find_element_by_css_selector("#su")
ActionChains(browser).move_to_element(action3).double_click(action3).perform()
# 鼠标移动到搜索按钮并双击
action4 = browser.find_element_by_css_selector("#su")
ActionChains(browser).move_to_element(action4).context_click(action4).perform()
# 鼠标移动到搜索按钮并右键
切换新的标签页
对于不同的网页(如哔哩哔哩),其当我们执行搜索是就会打开新的标签页。当时Selenium的一系列操作是不会因为新的标签页二切换的,这里我们就要手动的切换。
handles = browser.window_handles
# browser.switch_to_window(handles[1])
# switch_to_window方法已过期,使用switch_to.window方法来代替
browser.switch_to.window(handles[1])
例如:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Chrome()
browser.minimize_window()
browser.get("https://bilibili.com")
element = browser.find_element_by_css_selector("#banner_link > div > div > form > input")
# element = browser.find_element_by_name("text")
# text元素重命名多,建议使用cssselector和Xpath
element.clear()
element.send_keys("蔡徐坤")
time.sleep(2)
element.send_keys(Keys.RETURN)
time.sleep(2)
handles = browser.window_handles
# browser.switch_to_window(handles[1])
# switch_to_window方法已过期,使用switch_to.window方法来代替
browser.switch_to.window(handles[1])
T = True
page = 1
while T:
if page == 1:
for i in range(20):
XpathTag = "//*[@id="all-list"]/div[1]/div[2]/ul/li["+str(i+1)+"]/div/div[1]/a"
# element = browser.find_element_by_xpath("//*[@id="all-list"]/div[1]/div[2]/ul/li[1]/div/div[1]/a").text
element = browser.find_element_by_xpath(XpathTag).text
print(element)
else:
for i in range(20):
XpathTag = "//*[@id="all-list"]/div[1]/ul/li["+str(i+1)+"]/div/div[1]/a"
# element = browser.find_element_by_xpath("//*[@id="all-list"]/div[1]/div[2]/ul/li[1]/div/div[1]/a").text
element = browser.find_element_by_xpath(XpathTag).text
print(element)
print("")
try:
element = browser.find_element_by_css_selector("#all-list > div.flow-loader > div.page-wrap > div > ul > li.page-item.next > button").send_keys(Keys.RETURN)
page+=1
except:
T = False
finally:
time.sleep(2)
效果演示
<center><iframe src="//player.bilibili.com/player.html?aid=72048019&cid=124840343&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="ture" width="95%"height="400">
</iframe><center/>
加载插件
在之前的运行情况是会打卡一个空白浏览器的,但是为了实现我们就可以用浏览器的插件来实现一些效果,那应该如何使用浏览器插件呢?
在空白浏览器中新安装插件
from selenium import webdriver
from selenium.webdriver import ChromeOptions
options = ChromeOptions()
# 设置好应用扩展
extension_path = r"D:\Download\AdblockPlus2.crx"
options.add_extension(extension_path)
browser = webdriver.Chrome(options=options)
browser.get("https://search.bilibili.com/all?keyword=%E8%94%A1%E5%BE%90%E5%9D%A4&from_source=banner_search")
element = browser.find_element_by_xpath("//*[@id="all-list"]/div[1]/div[2]/ul/li[1]/div/div[1]/a").text
print(element)
这种方会在打开浏览器时安装插件,对于安装加载时间长的程序就会影响到使用感受。我们可以使用已经安装好插件。
加载本地安装好的插件
地址栏输入chrome://version/
查看浏览器信息
复制个人资料路径到User Data就结束了,例如:
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.keys import Keys
options = ChromeOptions()
options.add_argument("--user-data-dir="+r"C:\Users\lengqie\AppData\Local\Google\Chrome\User Data")
# browser.get("https://bilibili.com")
browser = Chrome(options=options)
browser.get("https://search.bilibili.com/all?keyword=%E8%94%A1%E5%BE%90%E5%9D%A4&from_source=banner_search")
element = browser.find_element_by_xpath("//*[@id="all-list"]/div[1]/div[2]/ul/li[1]/div/div[1]/a").text
print(element)
注意的是如果当前Chrome是开启状态,占用配置文件则会报错,需要关闭Chrome,并且由于缓存的问题,在这种状态下可能需要清除缓存的操作:
cookies = browser.get_cookies()
browser.delete_all_cookies()