0


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()

八、今日学习思维导图


本文转载自: https://blog.csdn.net/weixin_61319245/article/details/140989655
版权归原作者 开测开测 所有, 如有侵权,请联系我们删除。

“day15-测试自动化之selenium的HTML页面操作”的评论:

还没有评论