常用的API操作 续

1.上传文件

        方法:

                1.定位到下载文件按钮

                2.使用send_keys(文件路径)上传文件

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('file:///E:/310%E6%B5%8B%E8%AF%95%E7%B2%BE%E8%8B%B1%E7%8F%AD/10web%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/2023-05-24web%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95day04/resources/%E7%BB%83%E4%B9%A0%E9%A1%B5%E9%9D%A2/%E6%B3%A8%E5%86%8CA.html')

# 最大化浏览器
driver.maximize_window()

# 下拉滚动条
js = 'window.scrollTo(0,1000)'
driver.execute_script(js)

# 定位到上传文件的按钮,不点击!
ele = driver.find_element_by_name('upfilea')

# 使用send_keys上传文件
ele.send_keys(r'E:\310测试精英班\考试\python考试.md')
time.sleep(3)
driver.quit()

注意:1.文件路径有 / ,在路径前加上r

        2.一定不要点击上传文件按钮!!!点了无法退出窗口!!!会报错!!!


2.下载文件

2.1 下载文件---火狐

配置火狐浏览器的首选项(可以直接百度方法)

设置成2表示使用自定义的路径,0下载到桌面,1使用默认地址

        browser.download.folderList

是否显示开始下载,True表示显示,False表示不显示

        browser.download.manager.showWhenStarting

设置自定义下载的路径

        fp.set_preference("browser.download.dir",'d:\\')

是否需要弹窗询问

        fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")

import time
from selenium import webdriver
fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2)

fp.set_preference("browser.download.manager.showWhenStarting",False)

fp.set_preference("browser.download.dir",'d:\\')

fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")

driver = webdriver.Firefox(firefox_profile=fp)

driver.get('https://pypi.org/project/selenium/#files')

time.sleep(5)
driver.find_element_by_partial_link_text('selenium-4.9.1').click()

2.2 下载文件---谷歌

download.default_directory 配置下载路径

profile.default_content_settings.popups 取消弹窗询问

import time

from selenium import webdriver
pres = {
    "download.default_directory": "D://",
    "profile.default_content_settings.popups": 0
}

options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', pres)

driver = webdriver.Chrome(options=options)

driver.get('https://pypi.org/project/selenium/#files')

time.sleep(5)
driver.find_element_by_partial_link_text('selenium-4.9.1').click()

 


3.cookie处理

页面手动查看:

        1.打开F12--点击Application

        2.在左侧选择 cookies

语法:

        获取所有的cookie:                        driver.get_cookies()                

        获取指定name的cookie:               driver.get_cookie(name)

        添加一条cookie:

        cookie_dict = {"name": name值,"value": value值}

        driver.add_cookie(cookie_dict)

        删除一条cookie:                            driver.delete_cookie(name)

        删除所有的cookie:                        driver.delete_all_cookies()

from selenium import webdriver
import time

driver = webdriver.Chrome()

driver.get('http://www.baidu.com')

# 获取所有的cookies  返回一个字典,一个cookie是一条字典
print(driver.get_cookies())

# 获取其中某一条
print(driver.get_cookie("BAIDUID_BFESS"))

# 添加一条cookie
cookie_dict = {
    "name": "TestBaidu",
    "value": "0x12222222222222222222222222222222222222222"
}
driver.add_cookie(cookie_dict)

print(driver.get_cookies())

print('=' * 100)   # 分割线
# 删除其中某一个cookie
driver.delete_cookie('TestBaidu')

print(driver.get_cookies())

print('=' * 100)   # 分割线

# 删除所有的cookie,一个空列表
driver.delete_all_cookies()
print(driver.get_cookies())

time.sleep(10)
driver.quit()

 4.验证码处理

        处理方案:1.在测试环境去掉验证码------需要开发配合

                        2.设置万能码------程序后门

                        3.图片验证码识别技术  python-tesseract------不建议,不稳定

                        4.cookie伪装,绕过验证码

import time

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('http://www.baidu.com')

# 对比登录前后的cookies,将新增内容整理成列表
cookie_list = [
    {"name": "BDUSS",
     "value": "pJd3NZM0xMZXpZVW9Uck9ULVNQSTlublRNLXhJTkNwM0NNaH5iQ21HUk5CSlZrSVFBQUFBJCQAAAAAAAAAAAEAAAAPcn9Rt-i~8bXE0cC44Nfw1d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE13bWRNd21kYl"},
    {"name": "BDUSS_BFESS",
     "value": "pJd3NZM0xMZXpZVW9Uck9ULVNQSTlublRNLXhJTkNwM0NNaH5iQ21HUk5CSlZrSVFBQUFBJCQAAAAAAAAAAAEAAAAPcn9Rt-i~8bXE0cC44Nfw1d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE13bWRNd21kYl"}
]

# 把列表中的cookie添加到原本的cookies里面
for cookie in cookie_list:
    driver.add_cookie(cookie)

time.sleep(5)

# 刷新浏览器
driver.refresh()

time.sleep(10)

driver.quit()

5.元素等待

  分为强制等待,隐式等待和显示等待

  5.1 强制等待 使用time模块

  time.sleep(秒数)       无论页面是否加载完全,要使用的元素是否加载出来,都会等待满时间

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

time.sleep(10)

driver.find_element_by_id('kw').send_keys('源码时代')

  5.2 隐式等待  页面对象.implicitly_wait(秒数)

等待页面元素加载完毕,最多等10秒钟时间,往下执行查找元素

如果页面所有元素在 3 秒加载完毕,那么就只等待3秒钟

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

# 等待页面元素加载完毕,最多等10秒钟时间
# 如果页面所有元素在 3 秒加载完毕,那么就只等待3秒钟
driver.implicitly_wait(10)


driver.find_element_by_id('kw').send_keys('源码时代')

  优点:

        针对driver的整个周期有效,只需要设置一次

缺点:

        1.需要等待整个页面加载完毕之后才会往下执行,但是存在页面还未加载完毕,想要操作的元素已经加载完毕,因此会浪费等待时间

        2.超过等待时间之后,如果页面还未加载完毕,接着往下执行有可能存在元素找不到的问题

  5.3 显示等待

导包

from selenium.webdriver.support.wait import WebDriverWait

语法:

WebDriverWait(driver,超时时间,检测频率,忽略异常)

查找某个元素,一直查找10秒钟,每个0.5秒检测一次,存在则返回元素,不存在抛出TimeoutException的异常

其中until方法的message参数是可选抛出异常信息的参数

完整语法:

element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"),message="报错信息")

实现逻辑分析(可以查看类和方法的注释):

        1.WebDriverWait(driver, 10)实例化一个显式等待类

        2.调用until方法,把匿名函数传给 method 参数

        3.method 参数使用 method(self._driver)来达到查找元素的功能

from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id('kw'), "输入框没有找到")
element.send_keys("源码时代")

time.sleep(5)
driver.quit()

 

6.EC模块

导包

from selenium.webdriver.support import expected_conditions as EC

EC模块: expected_conditions 一般使用时候会通过 as 取别名为 EC

EC模块实际上就是selenium官方封装的一些用来 断言 的方法

断言:判断预期结果和实际结果是否相符合

EC模块的方法大多都有__call__魔法方法,因此可以直接()调用(后续详细解释__call__方法)

EC.title_is("百度一下,你就知道")(driver) 对比结果结果是否一致

EC.title_contains("百度一下")(driver) 对比结果是否包含EC.presence_of_element_located(locator=locator) 可以定位元素

from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

print(driver.title)

print(EC.title_is("百度一下,你就知道")(driver))

print(EC.title_contains("百度一下")(driver))


locator = ("id", "kw")

ele = EC.presence_of_element_located(locator=locator)(driver)
ele.send_keys("源码时代")



time.sleep(10)
driver.quit()

 7. EC和显示等待结合使用

import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

driver.get('http://www.baidu.com')

locator = ("id", "kw")

ele = WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator), message='输入框找不到')
ele.send_keys("源码时代")

time.sleep(10)
driver.quit()

补充

__call__:是一个魔法方法

        执行时机:直接执行对象的时候 如:对象() 就会直接调用执行 __call__方法

        作用:把对象当做是一个函数来进行调用

class Student(object):

    def __init__(self, name):
        print("实例化的时候执行__init__方法")
        self.name = name

    def __call__(self, *args, **kwargs):
        print("执行__call__方法")
        print(args)
        print(self.name)
        return self.name

    def add(self, num1, num2):
        print(num1 + num2)


# stu1 = Student("张三")
# stu1(1, 2, 3, 4, 5)
# stu1.add(1, 2)

Student("张三")(1, 2, 3, 4, 5)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值