selenium Web自动化

1.文件上传

        1).定位下载文件的按钮元素

# 定位下载文件的按钮元素
xpath的定位方式:
    # 标签+属性进行xpath定位
    driver.find_element_by_xpath(//标签名[@属性名=属性值])
    # 层级定位
        1).只找标签名下面的子标签,不包含更下一层的标签
        driver.find_element_by_xpath(//标签名[@属性名=属性值]/子标签名)
        2).找到该标签名下面所有符合规则的子标签名
         driver.find_element_by_xpath(//标签名[@属性名=属性值]//子标签名)
    # 索引定位  索引从 1 开始 只查找平级标签
    driver.find_element_by_xpath(//标签名/子标签名[索引值])
    # 模糊匹配
    driver.find_element_by_xpath(//标签名[contains(@属性名,部分属性值)])
    # 多条件查找
    driver.find_element_by_xpath(//标签名[@属性1=属性值1 and @属性2=属性值2])
css的定位方式:
    # 标签+属性定位
    driver.find_element_by_css_selector(标签名[属性名=属性值])
        类选择器:.class的值     id选择器:#id值
    # 层级
        1).包含选择器会选择子标签以及子标签下面的标签
        driver.find_element_by_css_selector(标签名[属性名=属性值] 子标签 )
        2).只会选择该标签下的子标签
        driver.find_element_by_css_selector(标签名[属性名=属性值]>子标签 )
    # 索引
        1).只要标签名下面是第索引个标签的都会找到
        driver.find_element_by_css_selector(标签名[属性名=属性值] :nth-child(索引值))
        2).只找标签名下面的第索引个标签
        driver.find_element_by_css_selector(标签名[属性名=属性值]>:nth-child(索引值))
    # 模糊匹配
    driver.find_element_by_css_selector(标签名[属性名*=部分属性值])
    # 多条件查找
    driver.find_element_by_css_selector(标签名[属性名1=属性值1][属性名2=属性值2])

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

元素.send_keys(文件路径)

下载文件:---火狐

# browser.download.folderList 设置成2表示使用自定义的路径,0下载到桌面,1使用默认地址
fp.set_preference("browser.download.folderList",2)
# browser.download.manager.showWhenStarting 是否显示开始下载,True表示显示,False表示不显示
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")

下载文件:---谷歌

# 实例化下载文件的方法
options = webdriver.ChromeOptions()
# download.default_directory 配置下载路径
# profile.default_content_settings.popups 取消弹窗询问
pres = {
    "download.default_directory": "D://",
    "profile.default_content_settings.popups": 0
}
网页上怎么去查看cookies
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()

验证码处理:

验证码处理方案:
    1.在测试环境去掉验证码---需要开发配合
    2.设置万能码---程序后门
    3.图片验证码识别技术 Python-tesseract ---不建议的方式,不稳定
    4.cookie伪装---实际项目中不确定就问前端开发
# 伪装了已经登录的cookie
cookie_list = [{"name": "BDUSS", "value":"pJd3NZM0xMZXpZVW9Uck9ULVNQSTlublRNLXhJTkNwM0NNaH5iQ21HUk5CSlZrSVFBQUFBJCQAAAAAE"},
{"name":"BDUSS_BFESS",
"value":"pJd3NZM0xMZXpZVW9Uck9ULVNQSTlublRNLXhJTkNwM0NNaH5iQ21HUk5CSlZrSVFBQUFBJCQAAAAAAA}]

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

time.sleep(5)

# 刷新浏览器
driver.refresh()

time.sleep(10)

driver.quit()

元素等待

1).强制等待

强制等待:time.sleep(秒数) 无论元素是否加载完毕,都要等这么久

2).隐式等待

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

#缺点

1.需要等待整个页面加载完毕之后才会往下执行,但是存在页面还未加载完毕,想要操作的元素已经加载完毕,因此会浪费等待时间
2.超过等待时间之后,如果页面还未加载完毕,接着往下执行
  有可能存在元素找不到的问题

#优点

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

3)显示等待

# 导包
from selenium.webdriver.support.wait import WebDriverWait
# 语法
WebDriverWait(driver,超时时间,检测频率,忽略异常)
# 查找某个元素,一直查找10秒钟,每个0.5秒检测一次,存在则返回元素,不存在抛出TimeoutException的异常
# 其中until方法的message参数是可选抛出异常信息的参数
element = WebDriverWait(driver,10).until(lambdax:x.find_element_by_id("someId"),message="报错信息")

# 实现逻辑分析:
   1.WebDriverWait(driver, 10)实例化一个显式等待类
   2.调用until方法,把匿名函数传给 method 参数
   3.method 参数使用 method(self._driver)来达到查找元素的功能

__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
# 调用
Student("张三")(1, 2, 3, 4, 5)

EC模块

# expected_conditions 一般使用时候会通过 as 取别名为 EC
from selenium.webdriver.support import expected_conditions as EC
# EC模块实际上就是selenium官方封装的一些用来 断言 的方法
       断言:判断预期结果和实际结果是否相符合

# 检查页面的title与期望值是都完全一致,如果完全一致,返回True,否则返回Flase
     EC.title_is("百度一下,你就知道")(driver)  
     EC.title_contains("百度一下")(driver) # 这个是部分匹配(类似于xpath里面的contains语法)

EC和显示等待结合使用

locator = ("id", "kw")
# EC和显示等待结合使用
ele = WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator), message='输入框找不到')
ele.send_keys("北京天安门")

time.sleep(10)
driver.quit()

综合使用

# 例子
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def find_element(driver, locator, timeout=20, msg=''):
    return WebDriverWait(driver, timeout).until(EC.presence_of_element_located(locator), message=msg)


# 1.实例化一个driver
driver = webdriver.Chrome()

# 2.打开对应的网页
driver.get('http://localhost:8080/ecshop/user.php')

# 3.定位用户名
user_locator = ("name", "username")
user_ele = find_element(driver, user_locator)
# user_ele = WebDriverWait(driver, 20).until(EC.presence_of_element_located(user_locator))

# 4.输入账号
user_ele.send_keys("admin2")

# 5.定位密码
password_locator = ("name", "password")
password_ele = WebDriverWait(driver, 20).until(EC.presence_of_element_located(password_locator))

# 6.输入密码
password_ele.send_keys("123456")

# 7.点击立即登录
login_locator = ("name", "submit")
WebDriverWait(driver, 20).until(EC.presence_of_element_located(login_locator)).click()

# 8.定位到账号的元素
admin_locator = ("class name", "f4_b")
try:
    ele = WebDriverWait(driver, 20).until(EC.presence_of_element_located(admin_locator))

except Exception as e:
    print(False)
    print(f"元素没有定位到:{e}")

else:
    # 9.判断登录之后的账号是否正确,正确打印 True 否则 False
    if ele.text == 'admin2':
        print(True)
    else:
        print(False)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值