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&amp;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&amp;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()

参考

挣扎的蓝藻

kelanmomo

NiceBlueChai

文章目录