day15-测试自动化之selenium的HTML页面操作

一、下拉选择框

        1.1.为什么单独使用下拉框?

                如果option选项没有value值的话,css定位或其他定位就不太方便

        1.2.说明

                下拉框就是HTML中<select>元素

        1.3.方法

                1).select_by_index(index)-->根据option索引l来定位,从o开始

                2).select_by_value(value)-->根据option属性value值来定位

                3).select_by_visible_text(text)--->根据option显示文本来定位

        1.4.注意

                1).select类是通过select标签来控制其下的option元素

                2).element:只能是select标签元素

                3).调用select类下面的方法,是通过索引l、value值、显示文本来操作

        1.5.代码

# 导包
from time import sleep

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("网页地址")

    # 网页最大化
    driver.maximize_window()

    # 隐式等待 设置十秒钟,抛出异常
    driver.implicitly_wait(3)

    # # 1.CSS定位到下拉框
    # driver.find_element(By.CSS_SELECTOR,"#sel").click()

    # 2.实例化Select类并定位到下拉框
    select = Select(driver.find_element(By.CSS_SELECTOR,"#sel"))

    # # select类定位,通过下标访问
    # select.select_by_index(0)
    # # 暂停两秒钟
    # sleep(2)
    # # select类定位,通过下标
    # select.select_by_index(1)

    # # select类通过value定位
    # select.select_by_value("p1")
    # # 暂停两秒钟
    # sleep(2)
    # # select类通过value定位
    # select.select_by_value("p2")

    # select类通过文本
    select.select_by_visible_text("op1")
    # 暂停两秒钟
    sleep(2)
    # select类通过文本
    select.select_by_visible_text("op2")

    # 暂停两秒钟
    sleep(2)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

二、弹出框

        2.1.弹出框分类

                1).警告框

                2).确认框

                3).提示框

        2.2.处理弹出框方法

                1).为什么处理弹出框?

                        如果页面有弹出框不处理,接下来的操作将不生效

                2).获取弹出框对象:alert=driver.switch_to.alert,针对这三个弹出框处理方法都一样

                3).调用

                        3.1).alert.text -->返回alert/confirm/prompt中的文本

                        3.2).alert.acceptO-->接受对话框选项

                        3.3).alert.dismissO--->取消对话框选项

                4).提示:无论以上哪个对话框,都可以使用取消、同意,因为调用的是后台的事件,跟页面显示的按钮数量无关

        2.3.注意

                1).driver.switchto.alert方法适用于以上三种类型对话框,调用时没有括号

                2).获取文本方法,调用时没有括号,如:alert.text

                3).在项目中不是所有的小窗口都是以上三种对话框

        2.4.代码

# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("http://localhost:63342/test_new/%E5%BC%B9%E5%87%BA%E6%A1%86.html?_ijt=s77hg71t561faals5jrk4mgi4i&_ij_reload=RELOAD_ON_SAVE")

    # 网页最大化
    driver.maximize_window()

    # 隐式等待 设置十秒钟,抛出异常
    driver.implicitly_wait(3)

    # 定位alert按钮并点击
    driver.find_element(By.CSS_SELECTOR,"input[value='alert警告框']").click()

    # 实例化弹出框对象
    alert = driver.switch_to.alert

    # 暂停两秒钟
    sleep(2)

    # 接受警告框
    alert.accept()

    # 定位confirm按钮并点击
    driver.find_element(By.CSS_SELECTOR, "input[value='confirm确认框']").click()

    # 确认框处理对象
    confirm = driver.switch_to.alert

    # 暂停两秒钟
    sleep(2)

    # 取消确认框
    confirm.dismiss()

    # 定位prompt按钮并点击
    driver.find_element(By.CSS_SELECTOR, "input[value='prompt提示框']").click()

    # 提示框处理对象
    prompt = driver.switch_to.alert

    # 取消提示框
    prompt.dismiss()

    # 暂停两秒钟
    sleep(2)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

三、滚动条操作

        3.1.概念

                滚动条是一种可控制页面显示范围的组件

        3.2.为什么要学习滚动条操作?

                1).在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载

                2).页面注册同意条款,需要滚动条到最底层,才能点击同意

        3.3.实现方式

                1).说明:selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的。

                2).步骤:

                        2.1).设置JavaScript脚本控制滚动条

                        2.2).selenium调用执行JavaScript脚本的方法--->driver.execute_script(js)

        3.4.说明

                在selenium中没有直接提供定位滚动条组件方法,但是它提供了执行js语句方法,可以提供js语句来控制滚动条操作

        3.5.代码

# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://news.baidu.com/")

    # 网页最大化
    driver.maximize_window()

    # 隐式等待 设置十秒钟,抛出异常
    driver.implicitly_wait(3)

    # 设置js脚本
    js = "window.scrollTo(0, 1000);"

    # 暂停两秒钟
    sleep(2)

    # 执行滚动条向下
    driver.execute_script(js)

    # 暂停两秒钟
    sleep(2)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

四、frame表单切换(重点!)

        4.1.概念

                HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素

        4.2.为什么要学习frame表单切换?

                当前主目录内没有iframe表单页面信息,不切换,找不到元素

        4.3.frame切换方法

                1).说明:在Selenium中封装了如何切换frame框架的方法

                2).方法

                        2.1).driver.switch_to.frame(frame_reference)---->切换到指定frame的方法。frame_reference:可以为frame框架的name、id或者定位到的frame元素(elemnent)

                        2.2).driver.switch_to.default_contentO---->恢复默认页面的方法

        4.4.提示

                1).为什么要回到主目录:iframe或frame只有在主目录才有相关元素信息,不回到主目录,切换语句会报错

                2).如何回到主目录:driverswitch_to.default_contentO

                3).切换表单时,可以使用name、id、iframe元素

        4.5.代码

# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://mail.qq.com/")

    # 网页最大化
    driver.maximize_window()

    # 隐式等待 设置十秒钟,抛出异常
    driver.implicitly_wait(3)

    # 切换到第一个表单
    FristFrame = driver.find_element(By.CSS_SELECTOR,"#QQMailSdkTool_login_loginBox_qq > iframe")
    driver.switch_to.frame(FristFrame)

    # 切换到密码登录表单
    driver.switch_to.frame("ptlogin_iframe")
    # 点击切换
    driver.find_element(By.CSS_SELECTOR, "#switcher_plogin").click()

    # 填写qq号
    driver.find_element(By.CSS_SELECTOR,"#u").send_keys("admin")

    # 填写密码
    driver.find_element(By.CSS_SELECTOR, "#p").send_keys("123456")

    # 提交登录
    driver.find_element(By.CSS_SELECTOR, "#p").send_keys(Keys.ENTER)

    # 暂停两秒钟
    sleep(1)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

五、多窗口切换(重点!)

        5.1.概念

                在HTML页面中,当点击超链接或者按钮时,有的会在新的窗口打开页面

        5.2.为什么切换多窗口?

                页面存在多个窗口时,seleniu默认焦点只会在主窗甲上所有的元素,不切换切换窗口,无法操作除主窗口以外的窗口内元素

        5.3.如何实现多窗口切换?

                1).说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;句柄:英文handle,窗口的唯一识别码

                2).方法:

                        2.1).driver.current_window_handle-->获取当前窗口句柄

                        2.2).driver.window_handles---->获取所有窗口句柄

                        2.3).driver.switch_to.window(handle)--->切换指定句柄窗口

        5.4.代码

# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://www.baidu.com/")

    # 网页最大化
    driver.maximize_window()

    # 隐式等待 设置十秒钟,抛出异常
    driver.implicitly_wait(3)

    # 获取新闻对象
    driver.find_element(By.XPATH,"//a[contains(text(),'新闻')]").click()

    # 获取所有窗口的句柄
    HandlesList = driver.window_handles

    # 判断句柄与当前网页句柄是否一致,不一致则跳转
    for handle in HandlesList:
        if driver.current_window_handle != handle:
            driver.switch_to.window(handle)

    # 暂停两秒钟
    sleep(2)

    # 关闭窗口验证当前主窗口已切换
    driver.close()

    # 暂停两秒钟
    sleep(2)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

六、窗口截图

        6.1.概念

                把当前操作的页面,截图保存到指定位置

        6.2.应用场景

                失败截图,可以让错误看的更直观

        6.3.如何操作窗口截图?

                1).说明:在Selenium中,提供了截图方法,我们只需要调用即可

                2).方法

                        driver.get_screenshot_as_file(imgpath)--->imagpath:图片保存路径

        6.4.扩展

                1).多条用例执行失败,会产生多张图片,可以采用时间戳的形式,进去区分

                2).driver.get_screenshot_as_file("./image/%s.png" %(time.strftime("%Y_%m_%d_%H_%M_%S"))strftime:将时间转为字符串函数

        6.5.代码

# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://mail.qq.com/")

    # 网页最大化
    driver.maximize_window()

    # 隐式等待 设置十秒钟,抛出异常
    driver.implicitly_wait(3)

    # 切换到第一个表单
    FristFrame = driver.find_element(By.CSS_SELECTOR,"#QQMailSdkTool_login_loginBox_qq > iframe")
    driver.switch_to.frame(FristFrame)

    # 切换到密码登录表单
    driver.switch_to.frame("ptlogin_iframe")
    # 点击切换
    driver.find_element(By.CSS_SELECTOR, "#switcher_plogin").click()

    # 填写qq号
    driver.find_element(By.CSS_SELECTOR,"#u").send_keys("admin")

    # 填写密码
    driver.find_element(By.CSS_SELECTOR, "#p").send_keys("123456")

    # # 截图保存
    # driver.get_screenshot_as_file("qqEmail.PNG")

    # 存放在指定目录
    driver.get_screenshot_as_file("../image/qqEmail.png")

    # 暂停两秒钟
    sleep(1)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

七、验证码处理

        7.1.概念

                一种随机生成的信息(数字、字母、汉字、图片、算术题)

        7.2.作用

                防止恶意的请求行为,增加应用的安全性

        7.3.为什么要学习验证码?

                在Web应用中,大部分系统在用户登录注册的时候都要求输入验证码,而我们在设计自动化测试脚本的时侯,就需要面临处理验证码的问题

        7.4.验证码的处理方式

                1).说明:Selenium中并没有对验证码处理的方法

                2).方式:

                        2.1).去掉验证码(测试环境下-采用--->自己的产品)

                        2.2).设置万能验证码 (生产环境和测试环境下-采用)

                        2.3).证码识别技术(通过python-tesseract来识别图片类型验证码;识别率达不到100%)

                        2.4).记录cookie(通过记录cookie进行跳过登录)

        7.5.提示

                1).去掉验证码、设置万能验证码:都是开发来完成;

                2).验证码识别技术:成功率不高,验证码种类繁多,不太适合;

                3).记录cookie:比较实用

        7.6.cookie

                1).概念

                        1.1).cookie是由web服务器生成的,并且保存在用户浏览器上的小文本文件,它可以包含用户相关的信息。

                        1.2).Cookie数据格式:键值对组成(python中的字典)

                        1.3).Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发-个Cookie数据

                        1.4).Cookie使用:当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务器检---->查该Cookie,以此来辨认用户状态。

                2).作用:标识一次对话的状态 (登录的状态)

                3).使用:浏览器自动记录cookie,在下一条请求时将cookie信息自动附加请求

        7.7.selenium操作cookie

                1).说明:Selenium中对cookie操作提供相应的方法

                2).方法

                        2.1).get_cookie(name)-->获取指定cookie---name:为cookie的名称

                        2.2).get_cookies()---->获取本网站所有本地cookies(常用)

                        2.3)add_cookie(cookie_dict)--->添加cookie(常用)----cookiedict:一个字典对象,必选的键包括::"name”and"value'

                3).注意

                        3.1). 以上百度BDUSS所需格式为百度网站特有,别的网站需自行查找

                        3.2).必须进行刷新操作

                4).代码

# 导包
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 获取浏览器对象
chromedriver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)


def main():
    # 打开页面
    driver.get("https://www.baidu.com/")

    # 网页最大化
    driver.maximize_window()

    # 隐式等待 设置十秒钟,抛出异常
    driver.implicitly_wait(10)

    # 百度cookie:XXX

    # 设置cookie
    driver.add_cookie({"name":"BDUSS","value":"XXX"})

    # # 获取所有cookie信息
    # cookies = driver.get_cookies()
    #
    # # 遍历获取的cookie信息
    # for i in cookies:
    #     print(i)

    # 获取单个cookie信息
    print(driver.get_cookie("BDUSS"))

    # 暂停三秒钟
    sleep(3)

    # 刷新操作,必须进行刷新才能看到登录效果
    driver.refresh()

    # 暂停三秒钟
    sleep(3)

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    main()

八、今日学习思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开测开测

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值