selenium.Webdriver的特殊操作

1.操作Ajax选项

Ajax就是Asynchronous JavaScript and XML(异步JavaScript and XML)

搜狗的搜索框使用了Ajax。Ajax在不加载整个网页的情况下,对网页的某部分内容进行更新。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

dr = webdriver.Chrome()
dr.get("https://www.sogou.com/")
searchbox = dr.find_element_by_xpath('//*[@id="query"]')
searchbox.click()
sleep(1)
searchbox.send_keys(Keys.ARROW_DOWN)
searchbox.send_keys(Keys.ARROW_DOWN)
searchbox.send_keys(Keys.ARROW_DOWN)
sleep(3)
dr.quit()

Ajax悬浮框内容会发生变化(根据一定的推荐算法,而某些时候可能只需要固定的第几个选项)可以参考以下代码

from selenium import webdriver
from time import sleep

dr = webdriver.Chrome()
dr.get("https://www.sogou.com/")
searchbox = dr.find_element_by_xpath('//*[@id="query"]')
searchbox.click()
sleep(1)
dr.find_element_by_xpath('//*[@id="vl"]/div[1]/ul/li[2]').click()
sleep(2)
dr.quit()

2.富文本编辑器(Rich Text Editor,RTE)

一种可内嵌于浏览器,所见即所得的文本编辑器。比如:邮箱

#writer:Taka
from selenium import webdriver
from time import sleep


dr = webdriver.Chrome()
dr.get('https://mail.163.com/')
sleep(3)
ele = dr.find_element_by_xpath('//div[@id="loginDiv"]/child::iframe')
dr.switch_to_frame(ele)
dr.find_element_by_xpath('//div[@class="u-input box"]/child::input[@name="email"]').send_keys("youremail")
dr.find_element_by_xpath('//div[@class="u-input box"]/child::input[@name="password"]').send_keys("yourpwd")
dr.find_element_by_xpath('//*[@id="dologin"]').click()
sleep(2)
dr.find_element_by_xpath('//*[@id="_mail_component_78_78"]').click()
sleep(2)
dr.switch_to_frame(3)
dr.find_element_by_xpath('/html/body').send_keys("hello word")
sleep(5)
dr.quit()

3.class的值有空格

<!DOCTYPEhtml>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>Title</title>
</head>
<body>
Pleace input your name:<inputclass="hello storm">
</body>
</html>

方案一:使用前半部分或后半部分的名称定位

以下案例用的前半部分

#writer:Taka
import os
from selenium import webdriver
from time impor tsleep

dr = webdriver.Chrome()
dr.get(os.getcwd()[:17]+'HTMLfile/myhtml7_3class包含空格.html')#我把上面的HTML放在该位置了
sleep(2)
dr.find_element_by_class_name('hello').send_keys("handsome")
sleep(1)
dr.quit()

方案二:使用CSS来定位元素,空格使用‘,’代替

#writer:Taka

import os
from selenium import webdriver
from time import sleep

dr = webdriver.Chrome()
dr.get(os.getcwd()[:17]+'HTMLfile/myhtml7_3class包含空格.html')
sleep(2)
dr.find_element_by_css_selector('.hello,storm').send_keys("handsome")
sleep(1)
dr.quit()

4、property、attribute、text的区别

“property”和“attribute”的中文意思十分接近,前者为属性,后者为特性。但是实际上这两种是不同的东西。property是DOM中的属性,是JavaScript里的对象;attribute是HTML标签上的特性,它的值只能是字符串。

以下实例感受三者区别:

#作者:Taka
from selenium import webdriver
from time import sleep

dr = webdriver.Chrome()
dr.get("https://www.baidu.com")
ele = dr.find_element_by_id('kw')
print(ele.get_property("id"))#获取元素id的属性值
dr.quit()

输出 :kw

#作者:Taka
#日期:2023/4/19
from seleniumimport webdriver
from time import sleep

dr = webdriver.Chrome()
dr.get("https://www.baidu.com")
ele = dr.find_element_by_id('kw')
# print(ele.get_property("id"))#获取元素id的属性值
# dr.quit()

ele.send_keys("hello")
print(ele.get_attribute("value"))
dr.quit()

输出:hello

from selenium import webdriver
from time import sleep

dr = webdriver.Chrome()
dr.get("https://www.baidu.com")
ele = dr.find_element_by_link_text("地图")
print(ele.text)
dr.quit()

输出:地图

 小结: get_property()就是获取元素属性,目标元素id和name就可以通过该方法获取; get_attribute("value")就是用来获取文本框中输入的内容的; text属性就是元素本身的文字显示。

5.定位动态id

示例:126邮箱

输入框有id属性,id的值由两部分组成,前面是auto-id-,后面是一串数字。刷新页面就会发现数字变化了,这就是动态id

如何进行定位?

  1. 使用其他定位方式定位。比如元素中有其他唯一属性:class name,name等等。
  2. 相对关系定位
    • 根据父子、兄弟相邻节点定位
    • 根据部分元素属性定位
    • Xpath提高3种强大的方法支持定位部分属性值。contains(a,b):如果a中含有字符串b、则返回True,否则返回False。starts-with(a,b):如果a以字符串b开头,则返回True,否则返回False。ends-with(a,b):如果a以字符串b结尾,返回True,否则返回False。

1.使用contains关键字

 这里无法唯一定位,垃圾方法

2.使用starts-with(a,b)

 这里无法唯一定位,垃圾方法

以上内容作为了解吧

5.操作cookie

一.cookie、session、token的区别

  1. cookie存储在浏览去本地客户端,当我们发送的请求携带cookie时可以实现登录的操作
  2. session存放在服务器
  3. token应用于应用程序

二.如何查看cookie

方法一:使用开发者工具查看

 方法二:查看网站信息

三、操作cookie的方法

获取全部的cookie

关键字:get_cookies,获取当前浏览器地址的所有cookie,返回结果是一个列表,列表元素是一个字典{key:value}

#作者:Taka

from seleniumimport webdriver
from time import sleep

url ='https://www.baidu.com/'
dr = webdriver.Chrome()
dr.implicitly_wait(20)
dr.get(url)
cur_cookie = dr.get_cookies()
print(type(cur_cookie))#输出返回值类型--->字典
print(len(cur_cookie))#输出cookie的数量
print(type(cur_cookie[0]))#输出单个cookie的类型
print(cur_cookie)#输出cookie值
sleep(2)
dr.quit()

关键字get_cookie

#作者:Taka

from selenium import webdriver
from time import sleep

url ='https://www.baidu.com/'
dr = webdriver.Chrome()
dr.implicitly_wait(20)
dr.get(url)
baidu_cookie = dr.get_cookie("BD_UPN")
print(type(baidu_cookie))#输出cookie类型
print(baidu_cookie)#输出cookie的值
dr.quit()

删除单个cookie

# 作者:Taka


from selenium import webdriver
from time import sleep

url = 'https://www.baidu.com/'
dr = webdriver.Chrome()
dr.implicitly_wait(20)
dr.get(url)
baidu_cookies = dr.get_cookies()
print(len(dr.get_cookies()))#删除前数量
dr.delete_cookie("BAIDUID")#删除名为BAIDUID的cookie
print(len(dr.get_cookies()))#删除后数量
dr.quit()

删除所有cookie

# 作者:Taka
# 日期:2023/4/21


from selenium import webdriver
from time import sleep

url = 'https://www.baidu.com/'
dr = webdriver.Chrome()
dr.implicitly_wait(20)
dr.get(url)
baidu_cookies = dr.get_cookies()
print(len(dr.get_cookies()))#删除前数量
dr.delete_all_cookies()#删除所有cookie
print(len(dr.get_cookies()))#删除后数量
dr.quit()

# 作者:Taka


from selenium import webdriver
from time import sleep

url = 'https://www.baidu.com/'
dr = webdriver.Chrome()
dr.implicitly_wait(20)
dr.get(url)
baidu_cookies = dr.get_cookies()
print(len(dr.get_cookies()))#删除前数量
dr.add_cookie({"name":"STORM","value":"123456"})#添加cookie
print(len(dr.get_cookies()))#删除后数量
dr.quit()

四.截图功能

# 作者:Taka
from selenium import webdriver

dr = webdriver.Chrome()
dr.get("https://www.baidu.com")
dr.implicitly_wait(20)
dr.save_screenshot("../reports/a.png")#截取当前页面,保存当前目录,保存成.png图片
#dr.get_screenshot_as_file()#等同上面的方法
dr.quit()

需求:为避免图片名称重复,将图片名称改为“脚本名+时间戳+png”格式

# 作者:Taka

#需求:为避免图片名称重复,将图片名称改为“脚本名+时间戳+png”格式
from selenium import webdriver
import os
import time

script_name = os.path.basename(__file__).split('.')[0]#获取脚本名
file_name = "../reports/"+script_name+str(time.time())+".png"#组合成文件名
# print(os.path.basename(__file__))#7_22截图2.py
# print(os.path.basename(__file__).split('.'))#['7_22截图2', 'py']
# print(script_name)#7_22截图2

dr = webdriver.Chrome()
dr.get("https://www.baidu.com")
dr.save_screenshot(file_name)#截图
dr.quit()

页面截图,返回二进制数据

from selenium import webdriver
dr = webdriver.Chrome()
dr.get("https://www.baidu.com")
a = dr.get_screenshot_as_png()#截图返回截图的二进制数据
print(type(a))
print(a)
dr.quit()

截图返回base64的字符串

# 作者:Taka

from selenium import webdriver
dr = webdriver.Chrome()
dr.get("https://www.baidu.com")
a = dr.get_screenshot_as_base64()#截图并返回base64的字符串
print(type(a))
print(a)
dr.quit()

截图对比

# 作者:Taka

from selenium import webdriver
import unittest,time
from PIL import Image
'''
某些情况下,我们需要对某个功能执行两次并分别截图,通过比较截图来验证功能是否没问题
首先安装Python的pillow包,然后from PIL import Image
'''
class ImageCompare(object):
    '''
    本实例实现的功能是对两张图片通过像素对比的算法,获取文件的像素个数大小
    然后通过循环的方式对两张图片的所有项目进行一一对比
    并计算对比结果的相似度的百分比
    '''
    def make_regalur_image(self,img,size = (256,256)):
        #将图片尺寸强制重置为指定的大小,然后再将其转换成RGB
        return img.resize(size).convert("RGB")

    def split_image(self,img,part_size = (64,64)):
        #将图片按给定大小切分
        w,h = img.size
        pw,ph = part_size
        assert w % pw == h % ph == 0
        return [img.crop((i,j,i + ph,j + ph)).copy()
                 for i in range(0,w,pw) for j in range(0,h,ph)]

    def hish_similar(self,lh,rh):
        #统计切分后每部分图片的相似度频率曲线
        assert len(lh) == len(rh)
        return sum(1 - (0 if l == r else float(abs(l-r)) / max(l,r))
                   for l,r in zip(lh,rh)) / len(lh)

    def calc_similar(self,li,ri):
        #计算两张图片的相似度
        return sum(self.hish_similar(l.histogram(),r.histogram())
                   for l,r in zip(self.split_image(li),self.split_image(ri)))/16.0

    def calc_similar_by_path(self,lf,rf):
        li,ri = self.make_regalur_image(Image.open(lf)),\
            self.make_regalur_image(Image.open(rf))
        return self.calc_similar(li,ri)

class TestDemo(unittest.TestCase):
    def setUp(self):
        self.IC = ImageCompare()
        self.driver = webdriver.Chrome()

    def test_ImageComparison(self):
        self.driver.get("https://www.baidu.com/")
        self.driver.save_screenshot("../reports/a.png")
        time.sleep(1)
        self.driver.get("https://www.baidu.com/")
        self.driver.save_screenshot("../reports/b.png")
        time.sleep(1)
        print("图片相似度为:",self.IC.calc_similar_by_path("../reports/a.png","../reports/b.png"))

    def tearDown(self):
        self.driver.quit()


if __name__ == '__main__':
    unittest.main()

断言失败截图

# Writer:Taka

from selenium import webdriver
from time import sleep

dr = webdriver.Chrome()
dr.get("https://www.baidu.com/")
dr.find_element_by_id("kw").send_keys("Hello")
print(dr.find_element_by_id('kw').get_property("value"))
if dr.find_element_by_id('kw').get_property("value") == "hello":
    print("输入hello成功")
else:
    dr.save_screenshot("../reports/baidu_test.png")
dr.quit()

五、获取焦点元素

# Writer:Taka
import time

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 获取当前焦点所在元素的attribute信息
id = driver.switch_to.active_element.get_attribute("id")
element_facus = driver.switch_to.active_element
element_facus.send_keys("123456")
print(id)
time.sleep(2)
driver.quit()

六、颜色验证

<!DOCTYPE html>
<html>
<head>
	<title>红色背景页面</title>
	<style id="ground" type="text/css">
		body {
			background-color: rgba(0, 0, 0, 1);
		}
	</style>
</head>
<body>
	<h1>这是一个黑色背景的页面
	body {
			background-color: black;
		}</h1>

	<p>你好,这是一个示例页面。</p>
</body>
</html>
# Writer:Taka
import os
import time

from selenium.webdriver.support.color import Color
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pytest
# 创建 Chrome WebDriver 实例
driver = webdriver.Chrome()

# 打开网页
file_path = os.getcwd()[:40]+"Webpage_HTML/redground.html"
print(file_path)
driver.get(file_path)

# 等待页面加载完毕并检查背景颜色
time.sleep(3)
RED = Color.from_string("rgba(0, 0, 0, 1)")

background_color = driver.find_element(By.TAG_NAME,"body").value_of_css_property("background-color")
print(background_color)
assert background_color == "rgba(0, 0, 0, 1)","页面背景颜色不是红色"
# 关闭浏览器 20;、

driver.quit()

七、JavaScript 的应用

操作页面元素

# Writer:Taka

from selenium import webdriver
from time import sleep

dr = webdriver.Chrome()
dr.get("https://www.baidu.com")
sleep(2)
ele1JS = 'document.querySelector("#kw").value="123456"'
ele2JS = 'document.querySelector("#su").click()'
dr.execute_script(ele1JS)
sleep(1)
dr.execute_script(ele2JS)
sleep(1)
dr.quit()

修改页面元素

<input type="datetime-local" id="time" readonly>
# Writer:Taka
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

import os

driver = webdriver.Chrome()
file_path = os.getcwd()[:40]+"Webpage_HTML/readonly_datetime.html"

driver.get(file_path)
time.sleep(2)
js1 = 'document.getElementById("time").removeAttribute("readonly")' # 原生js.移除属性

# js1 = '$("input[id=time]").removeAttr("readonly")'# jQuery,移除属性
# js1 = '$("input[id=time]").attr("readonly",False)'# jQuery,设置属性为False
# js1 = '$("input[id=time]").attr("readonly",“”)'# jQuery,设置属性为空
driver.execute_script(js1)
ele_time = driver.find_element(By.XPATH,"/html/body/input")
ele_time.send_keys("002023/05/05/15/59")
time.sleep(10)


# driver.close()

操作滚动条

# Writer:Taka
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("123456")
driver.find_element_by_id("su").click()
js1 = "window.scrollTo(0,document.body.scrollHeight)"# 滑动滚动条到最底部
js2 = "window.scrollTo(0,0)" # 滑动到顶端
js3 = "window.scrollTo(0,200)" # 滑动200像素
js4 = "arguments[0].scrollIntoView();" # 滑动到指定元素
sleep(2)
driver.execute_script(js1)
print("已完成到最底部")
sleep(5)

driver.execute_script(js2)
print("已完成到最顶部")
sleep(5)

driver.execute_script(js3)
print("已完成滑动200像素")
sleep(5)
driver.execute_script(js2)
sleep(2)
ele_argument = driver.find_element(By.XPATH,'//*[@id="rs_new"]/div')# 定位某个元素
driver.execute_script(js4,ele_argument)#滑动到上方定位元素位置
print("已完成到指定元素位置")
sleep(5)

driver.quit()

操作滚动条左右移动

# Writer:Taka
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.set_window_size(500,500)
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("123456")
sleep(1)

js1 = "window.scrollTo(document.body.scrollWidth,0)"# 滑动滚动条到最右边
js2 = "window.scrollTo(0,0)" # 滑动到最左边
js3 = "window.scrollTo(200,0)" # 向右滑动200像素

sleep(2)
driver.execute_script(js1)
print("已完成到最右")
sleep(5)

driver.execute_script(js2)
print("已完成到最左部")
sleep(5)

driver.execute_script(js3)
print("已完成向右滑动200像素")
sleep(5)
driver.execute_script(js2)
sleep(5)


driver.quit()

操作内嵌滚动条

# Writer:Taka
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.get("https://sahitest.com/demo/iframesTest.htm")
ele_iframe1 = driver.find_element(By.XPATH,"/html/body/iframe")
driver.switch_to.frame(ele_iframe1)
sleep(2)
js1 = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js1)
sleep(2)
driver.quit()

八、高亮显示正被操作的元素

# Writer:Taka

def heighLightElement(driver,element):
    '''
    封装显示页面元素的方法:使用js代码将页面元素对象的背景颜色设置成绿色,边框设置为红色
    :param driver:
    :param element:
    :return:
    '''
    driver.execute_script("arguments[0].setAttribute('style',arguments[1]);",element,"background:yellow;border: 10px solid red;")

if __name__ == '__main__':
    from selenium import webdriver
    from time import sleep
    driver = webdriver.Chrome()
    driver.get("https://www.baidu.com")
    ele = driver.find_element_by_id("kw")
    heighLightElement(driver,ele)
    sleep(3)
    driver.quit()

九、JavaSript操作span元素

# Writer:Taka
from selenium import webdriver
from time import sleep
from tools.getHTMLfilepath import get_htmlpath

driver = webdriver.Chrome()
htmlfile = get_htmlpath()+"含有span类型2..html"
driver.get(htmlfile)
js1 = "document.getElementById('span_id').innerText='aaa'"
driver.execute_script(js1)
sleep(2)
driver.quit()

十、定制参数启动浏览器

最大化启动

# Writer:Taka
from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")#z最大化参数
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.baidu.com")
sleep(2)
driver.quit()

指定编码格式

# Writer:Taka
from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
options.add_argument("lang=zh_CN.UTF-8")
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.baidu.com")
ele = driver.find_element_by_id("su")
print(ele)
driver.quit()

指定浏览器的driver

# Writer:Taka
from selenium import webdriver
from time import sleep


driver = webdriver.Chrome(executable_path="D:\python\chromedriver.exe")
driver.get("https://www.baidu.com")
ele = driver.find_element_by_id("su")
print(ele)
driver.quit()

无界面启动

# Writer:Taka
from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
options.add_argument('headless')
dr = webdriver.Chrome(chrome_options=options)
dr.get("https://www.baidu.com")
ele = dr.find_element_by_id("kw")
print(ele)
dr.quit()

禁止加载图片

# Writer:Taka
from selenium import webdriver
from time import sleep


options = webdriver.ChromeOptions()
prefs = {
    'profile.default_content_setting_values' : {
        'images' : 2
    }
}
options.add_experimental_option("prefs",prefs)
dr = webdriver.Chrome(chrome_options=options)
dr.get("https://www.baidu.com")
sleep(3)
dr.quit()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值