Selenium4+xpath

1.简介

Selenium是当前广泛使用的开源自动化测试框架之一,它提供了丰富的工具和库,用于自动化测试Web应用程序。

Selenium的主要功能是模拟用户与Web应用程序的交互,并能够自动化执行各种操作,如点击按钮、填写表单、验证页面元素等。通过这种方式,测试人员可以快速有效地执行大规模的测试,并验证应用程序在各种情况下的可靠性和稳定性。

在实际渗透时,我们有时需要模拟人类对网站进行访问,或对网站进行某些自动化行为,我们可以借助Selenium框架实现。

2.xpath

2.1xpath简介

XPath使用一种类似于目录结构的路径表达式,该表达式可以从根节点开始或当前节点开始,通过层级关系和条件筛选来定位所需的节点。XPath支持广泛的节点选择符号,如标签名、属性值、位置、逻辑运算符等,从而实现灵活的节点选择和过滤。

2.2安装模块

pip install lxml

2.3xpath使用

2.3.1.etree

etree 把 html源码变成对象

import requests
from lxml import etree
def main():
url = "http://www.4399dmw.com/donghua/"
headers = {
"User-agent":"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
resp = requests.get(url=url,headers=headers)
#网页的源码
html_doc = resp.content.decode("utf-8")
#使用etree去转化html_doc,转化为了一个html的对象,此时element对象可以使用xpath语法
html = etree.HTML(html_doc)
print(html.xpath("xpath语法"))
pass

2.3.2xpath语法

xpath语法中[1]就是第一个

基础用法

//a			查询当前HTML页面所有的a标签
//a/@href 当前html页面中所有a标签中的href的属性内容
//a/text() 所有a标签中的文本内容

属性处理

//img/@src	拿到所有img标签中src的内容
//a/img/@src 拿到所有a标签中的img标签里的src的内容
//img[@alt='某个值']/@src 选择img标签中alt是某个值的标签并且提取src值

class标签处理

//a[@class='u-card'][1]/img 选到所有的a标签下的class的值为u-card中的第1个的img标签
//div[@class='lst-item'][3]/a[4]/img 选取页面中所有div且class等于lst-item选择其中第三个,在此之下选择第四个a标签下的img标签
//div[@class='lst-item'][1]/a[last()]/img 这里的a标签是选择最后一个

p标签

//p[text='超变武兽第二季']查找所有p标签中,文字内容是xxx的
//p[contains(text(),'蜡笔')] 查找所有p标签中,包含某些文字的
//p[@*] 页面中所有p标签凡是带有属性的都选出来

div标签

//div[@class='lst-item'][2]/*
将所有div标签class属性等于lst-item中的第二个中的所有内容

//div[@class='m-lst']/div[position()=4]
选择页面中所有class是m-ls的div中的第四个div

2.3.3实战

import requests
from lxml import etree
def main():
url = "http://www.4399dmw.com/search/dh-1-0-0-0-0-0-0/"
headers = {
"User-agent":"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
resp = requests.get(url=url,headers=headers)
#网页的源码
html_doc = resp.content.decode("utf-8")
#使用etree去转化html_doc,转化为了一个html的对象,此时element对象可以使用xpath语法
html = etree.HTML(html_doc)
donghuatitle = html.xpath("//div[@class='u-ct']/p[@class='u-tt']/text()")
donghuapic = html.xpath("//div[@class='lst']/a/img/@data-src")
print(donghuatitle)
print(donghuapic)
pass

把每一页都爬下来,自动寻找下一页

import requests
from lxml import etree
#页面内爬虫
def pachong(url):
url = url
headers = {
"User-agent":"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
resp = requests.get(url=url,headers=headers)
#网页的源码
html_doc = resp.content.decode("utf-8")
#使用etree去转化html_doc,转化为了一个html的对象,此时element对象可以使用xpath语法
html = etree.HTML(html_doc)
donghuatitle = html.xpath("//div[@class='u-ct']/p[@class='u-tt']/text()")
donghuapic = html.xpath("//div[@class='lst']/a/img/@data-src")
print(donghuatitle)
print(donghuapic)
pass
#发现下一页
def find_next_page(url):
url = url
headers = {
"User-agent":"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
resp = requests.get(url=url,headers=headers)
#网页的源码
html_doc = resp.content.decode("utf-8")
html = etree.HTML(html_doc)
next_page = html.xpath("//a[contains(text(),'下一页')]/@href")
really_next_page = "http://www.4399.dmw.com"+nextpage[0]
return real_next_page

def main():
url = "http://www.4399dmw.com/search/dh-1-0-0-0-0-1-0/"
while True:
try:
print("开始爬行的url:"+url)
pachong(url)
url = find_next_page(url)
except:
break
print("最后一页也爬行完了")
pass

在浏览器中中可下载xpath插件,方便写xpath语法匹配内容,

这里推荐

https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl?hl=zh-CN

3.selenium

3.1简介

Selenium是一款强大的开源自动化测试工具,用于模拟和控制浏览器行为,实现对Web应用程序的自动化测试。它支持多种编程语言和浏览器,提供了丰富的功能和灵活的API,是开发人员和测试人员首选的自动化测试解决方案。

3.2安装

1.selenium模块

pip install selenium

手动下载chromedriver:

https://vikyd.github.io/download-chromium-history-version/#/

注意:需要下载chrome对应版本的驱动使用

自动安装:

pip install webdriver-manager
pip install packaging

之后建立一文件

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.baidu.com/")
driver.quit()

进度条满后自动则安装成功

3.3使用

1.打开网页

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(5)
driver.quit()

2.按键包

#引入键盘按键包
from selenium.webdriver.common.keys import Keys
driver.find_element("id", "kw").send_keys("this s a test")
#组合键输入键盘上的ctrl+a
driver.find_element("id", "kw").send_keys(Keys.CONTROL,'a')
#输入键盘上的ENTER
driver.find_element("id", "kw").send_keys(Keys.ENTER)

3.配置浏览器启动使用Option类

# 导入Option类
from selenium.webdriver.chrome.options import Options
# 实例化一个Option类的对象
options = Options()

# 配置浏览器显示大小
options.add_argument('--window-size=1366,768')
#Option还常用一下
#--user-agent="" 设置请求头的User-Agent
#--window-size=1366,768 设置浏览器分辨率(窗口大小)
#--headless 无界面运行(无窗口)
#--start-maximized 最大化运行(全屏窗口)
#--incognito 隐身模式(无痕模式)
#--disable-javascript 禁用javascript
#--disable-infobars 禁用浏览器正在被自动化程序控制的提示

# 启动浏览器,并将启动参数带入到浏览器中
driver = webdriver.Chrome(options=options)

4.设置启动型号

#设置手机型号1
mobileEmulation = {'deviceName': 'iPhone 6/7/8'}
#设置手机型号2
mobileEmulation = {
"deviceMetrics":{
"width":350,
"height":200,
"pixelRatio":3.0,
"touch":False

}
}
# 使用手机浏览
options.add_experimental_option('mobileEmulation', mobileEmulation)

5.模拟点击

手机下操作鼠标!!有时候页面存在覆盖层,需要点击两次

这里像素点的获取推荐使用google插件Page Ruler Smart

from selenium.webdriver.common.action_chains import ActionChains
#点击70.120像素
action = ActionChains(driver).move_by_offset(70,120).click()
#开始执行
action.perform()
#移回鼠标
ActionChains(driver).move_by_offset(-70,-120).perform()

6.模拟悬停

获取登录位置示例

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(options=options)
driver.get("https://www.bilibili.com/")
denglu = driver.find_element(By.XPATH,"//div[@class='header-login-entry']")
ActionChains(driver).move_to_element(denglu).click().perform()

点击可以一次执行多个

driver = webdriver.Chrome(options=options)
driver.get("https://www.bilibili.com/")
#定位到频道
pingdao = driver.find_element(By.XPATH,"//div[@class='icon-bg icon-bg__channel']")
#定位到登录
denglu = driver.find_element(By.XPATH,"//div[@class='header-login-entry']")
action = ActionChains(driver)
action.click(pingdao)
time.sleep(2)
action.click(denglu)
action.perform()
time.sleep(5)
driver.quit()

测试结果:先点击频道,后点击登录

3.4模拟人类操作

1.手机处理拖拽操作

# 启动浏览器,并将启动参数带入到浏览器中
driver = webdriver.Chrome(options=options)
driver.get("https://xrect1fy.github.io/")

#拖拽操作
first_tar = driver.find_element(By.XPATH,"//a[@title='Python基础(更新中)'and@class='article-title']")
second_tar = driver.find_element(By.XPATH,"//h1")
action = ActionChains(driver)
action.drag_and_drop(first_tar,second_tar).perform()

拖拽操作需要使用xpath或者其他方法找到起始位置和终末位置

first_tar是初始位置,second_tar是终末位置

初始:

终末:

2.鼠标点击像素的操作

ActionChains(driver).move_by_offset(200,300).click().perform()
ActionChains(driver).move_by_offset(-200,300)

3.点击写入只能一个一个字按

ActionChains(driver).move_by_offset(500,95).click().key_down("a").perform()
ActionChains(driver).move_by_offset(-500,-95).perform()

鼠标操作

click()点击鼠标左键
click and hold() 点击鼠标左键不放
context_click() 点击鼠标右键不放
double_click() 双击鼠标左键
drag_and_drop() 鼠标拖拽
drag_and_drop_by_offset()鼠标拖拽到哪个坐标然后松开
key_down("a") 按下一个键
key_up("a") 抬起一个键
move_to_element(ele) 移动鼠标到某个元素的位置
move_to_element_with_offset(ele,100,0) 移动到某个元素的相对多少距离

根据像素拖拽

#拖拽操作
action = ActionChains(driver)
first_tar = driver.find_element(By.XPATH,"//a[@title='XSS基础'and@class='article-title']")
ActionChains(driver).drag_and_drop_by_offset(first_tar,0,10).perform()

4.处理下拉框

from selenium.webdriver.support.ui import Select
ele = driver.find_element(By.XPATH,"//select[@class='year']")
#使用select包裹起来xpath查找到的select元素
select1 = Select(ele)
#选择值是动漫专区
result = select1.select_by_value("动漫专区")

5.新建选项卡

#打开新标签页
js = 'window.open("http://www.baidu.com")'
driver.execute_script(js)

6.窗口切换

print(driver.current_url)
#切换窗口
driver.switch_to.window(driver.window_handles[1])
#切换回初始窗口
driver.switch_to.window(driver.window_handles[0])

#window_handles列表先后记录了打开窗口的句柄

7.关于iframe的处理

论坛

寻找到iframe的位置,聚焦转换到iframe上

find_div = driver.find_element(定位的元素)
driver.switch_to.frame(find_div)

释放iframe,回到主页上!!

#释放iframe,回到主页上
driver.switch_to.default_content()

8.处理弹窗

driver.switch_to.alert.accept()

4.参考文章

https://blog.csdn.net/wangqiang_cyou/article/details/128900832

https://blog.csdn.net/u013454322/article/details/128399381

selenium中的find_element方法