Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。
ChromeDriver 是 google 为网站开发人员提供的自动化测试接口,WebDriver是一个开源工具,用于在许多浏览器上自动测试webapps。它提供了导航到网页,用户输入,JavaScript执行等功能
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
driver = webdriver.Chrome(executable_path=r"../data/chromedriver.exe")
driver.get("https://passport.bilibili.com/login")
time.sleep(30)
# 切换到第二个选项卡 driver.switch_to_frame()
driver.switch_to_window(driver.window_handles[1])
self.driver.switch_to.window(self.driver.window_handles[1])
# 页面左边两个忽略掉
showIM_list = self.driver.find_elements_by_xpath("//span[@class='vip-name-check fans-name']")
print('当前页私信联系数量:', len(showIM_list))
XPath 是一门在 XML、HTML 文档中查找信息的语言,XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式
from lxml import etree
wb_data = """
"""
html = etree.HTML(wb_data)
# 通过etree.HTML把字符串转化为 Element html 对象
print(html)
# 可以看出在来的标签上面添加了html和body标签
print(etree.tostring(html))
print('用法1:获取某个标签元素(标签 + 属性 + 值),a后面不用再加斜杆,否则报错')
data = html.xpath("/html/body/div/ul/li/a")
for i in data:
print(i.text)
print('用法2:获取某个标签元素的内容(直接在需要查找内容的标签后面加一个/text()即可)')
data = html.xpath("/html/body/div/ul/li/a/text()")
for i in data:
print(i)
print('用法3:获取a标签的某个属性,//表示文档里的任何位置的节点')
data = html.xpath('//li//a/@href')
for i in data:
print(i)
print('用法4:找到路径下a标签属性等于link2.html的内容')
data = html.xpath("//a[@href='link2.html']/text()")
print(data) # 返回的都是List列表类型
for i in data:
print(i)
print('用法5:查找倒数第二个li标签里的a标签的href属性')
data = html.xpath("//li[last()-1]/a/text()")
for i in data:
print(i)
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
driver = webdriver.Chrome(executable_path="../data/chromedriver.exe")
driver.get("https://passport.bilibili.com/login")
time.sleep(40)
# 切换选项卡功能
driver.switch_to_window(driver.window_handles[1])
# xpath // 代表从任何路径开始, @代表的是属性
showIM_list = driver.find_elements_by_xpath("//span[@class='vip-name-check fans-name']")
print('当前页的粉丝数量为:',len(showIM_list))
for index, im in enumerate(showIM_list):
# ActionChains: https://www.cnblogs.com/king8/p/10383308.html
ActionChains(driver).move_to_element(im).perform()
time.sleep(1)
# 鼠标放上去后通过 shift + Q 可以采用快捷键 触发检查元素,默认是在当前页面打开,如果想新开页面则获取地址,手动打开
href = driver.find_element_by_xpath("//a[@class='btn idc-btn default']")
url = href.get_attribute("href")
# 执行js相关代码此方法重要
driver.execute_script("window.open('" + url + "')")
time.sleep(2)
# # 切换到新tab页面(第三个页面)
driver.switch_to.window(driver.window_handles[2])
textarea = driver.find_element_by_xpath("//textarea[@class='textarea'][@placeholder='回复一下吧~']")
textarea.send_keys("测试一下!")
time.sleep(1)
# textarea文本域写了内容后,在按钮处会自动添加一个active样式
send_text = driver.find_element_by_xpath("//button[@class='btn-box send-btn active']")
print(send_text)
# send_text.click()
driver.close() # 关闭当前tab选项卡
driver.switch_to.window(driver.window_handles[1])
第一页所有数据搞定是没有意义的,很多时候我们需要实现翻页效果,其次当前用户操作失败如果没有异常捕获那么程序会自动停止,因此为了程序的健壮性可以在操作的部分捕获异常。
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
driver = webdriver.Chrome(executable_path="../data/chromedriver.exe")
driver.get("https://passport.bilibili.com/login")
time.sleep(40)
# 切换选项卡功能
driver.switch_to_window(driver.window_handles[1])
def send_message():
# xpath // 代表从任何路径开始, @代表的是属性
showIM_list = driver.find_elements_by_xpath(
"//span[@class='vip-name-check fans-name' or @class='vip-name-check fans-name this-is-vip']")
print('当前页的粉丝数量为:', len(showIM_list))
for index, im in enumerate(showIM_list[:2]):
try:
# 执行鼠标移动的功能
ActionChains(driver).move_to_element(im).perform()
time.sleep(1)
href = driver.find_element_by_xpath("//a[@class='btn idc-btn default']")
url = href.get_attribute('href')
# 创建一个新tab选项卡,可以调用js来完成
driver.execute_script("window.open('" + url + "')")
time.sleep(2)
# 切换的新的选项卡
driver.switch_to.window(driver.window_handles[2])
textarea = driver.find_element_by_xpath("//textarea[@class='textarea'][@placeholder='回复一下吧~']")
textarea.send_keys('感谢您的关注!')
btn = driver.find_element_by_xpath("//button[@class='btn-box send-btn active']")
# print(btn)
btn.click()
time.sleep(2)
except Exception as e:
print(f'第{index}行,推送消息失败,错误消息为:{e.msg}')
finally:
driver.close() # 关闭当前tab选项卡
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
next_page = driver.find_element_by_xpath("//li[@class='be-pager-next'][@title='下一页']")
next_page.click()
time.sleep(3)
send_message()
# 启动时候调用当前函数
send_message()