webUI自动化

环境:selenium库+python基础知识
selenium 自动化流程如下:
自动化程序调用Selenium 客户端库函数(比如点击按钮元素)
客户端库会发送Selenium 命令 给浏览器的驱动程序
浏览器驱动程序接收到命令后 ,驱动浏览器去执行命令
浏览器执行命令
浏览器驱动程序获取命令执行的结果,返回给我们自动化程序
自动化程序对返回结果进行处理

元素定位的基本方法:
根据 元素的id 属性选择元素
根据 class属性、tag名 选择元素
根据 tag 名 选择元素
选择所有的tag名为 div的元素,如下所示
# 根据 tag name 选择元素,返回的是 一个列表
# 里面 都是 tag 名为 div 的元素对应的 WebElement对象
elements = wd.find_elements_by_tag_name('div')
# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
print(element.text)
通过WebElement对象选择元素
通过WebElement对象的 get_attribute 方法来获取元素的属性值,
比如要获取元素属性class的值,就可以使用 element.get_attribute('class')


设置最大等待时长为 10秒
bro.implicitly_wait(10)

find_element 和 find_elements 的区别
使用 find_elements 选择的是符合条件的 所有 元素, 如果没有符合条件的元素, 返回空列表
使用 find_element 选择的是符合条件的 第一个 元素, 如果没有符合条件的元素, 抛出 NoSuchElementException 异常

获取输入框里面的文字
对于input输入框的元素,要获取里面的输入文本,用text属性是不行的,这时可以使用 element.get_attribute('value')
比如
element = wd.find_element_by_id("input1")
print(element.get_attribute('value')) # 获取输入框中的文本

获取元素文本内容2
通过WebElement对象的 text 属性,可以获取元素 展示在界面上的 文本内容。
但是,有时候,元素的文本内容没有展示在界面上,或者没有完全完全展示在界面上。 这时,用WebElement对象的text属性,获取文本内容,就会有问题。
出现这种情况,可以尝试使用 element.get_attribute('innerText') ,或者 element.get_attribute('textContent')

获取整个元素对应的HTML
要获取整个元素对应的HTML文本内容,可以使用 element.get_attribute('outerHTML')
如果,只是想获取某个元素 内部 的HTML文本内容,可以使用 element.get_attribute('innerHTML')

对于Select 选择框, Selenium 专门提供了一个 Select类 进行操作。
select_by_value:根据选项的 value属性值 ,选择元素
select_by_index:根据选项的 次序 (从0开始),选择元素
select_by_visible_text:根据选项的 可见文本 ,选择元素。比如,下面的HTML:
<option value="foo">Bar</option>
就可以根据 Bar 这个内容,选择该选项
s.select_by_visible_text('Bar')

deselect取消选择:
deselect_by_value
根据选项的value属性值, 去除 选中元素
deselect_by_index
根据选项的次序,去除 选中元素
deselect_by_visible_text
根据选项的可见文本,去除 选中元素
deselect_all
去除 选中所有元素

Selenium 提供的 ActionChains 类来实现:
鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等

冻结页面:
在 开发者工具栏 console 里面执行如下js代码:setTimeout(function(){debugger}, 5000)
表示在 5000毫秒后,执行 debugger 命令
执行该命令会 浏览器会进入debug状态。 debug状态有个特性, 界面被冻住, 不管我们怎么点击界面都不会触发事件。

*包含 ^以什么开头 $以什么结尾

xpath选择器:http://www.python3.vip/tut/auto/selenium/xpath_1/



from selenium import webdriver
from selenium.webdriver.support.ui import Select # 导入select类
from selenium.webdriver.common.action_chains import ActionChains
import time
bro = webdriver.Chrome()
# 设置最大等待时长为 10秒
bro.implicitly_wait(10)

# 示例一:用xpath/id定位元素
'''
bro.get('https://www.baidu.com/')
wd = bro.find_element_by_xpath('//*[@id="kw"]')
wd.send_keys('白月黑宇')
bro.find_element_by_xpath('//*[@id="su"]').click()
ele = bro.find_element_by_id('1')
print(ele.text)
print(ele.get_attribute('tpl'))
bro.quit()
'''

# 示例二:用css_selector表达式用.class值定位元素
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample1.html')
ele = bro.find_element_by_css_selector('.animal')
print(ele.text)
print(ele.get_attribute('outerHTML'))
bro.quit()
'''

# 示例三:css_selector用#id值定位元素
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample1.html')
eles = bro.find_elements_by_css_selector('#inner21')
for ele in eles:
print(ele.text)
print(ele.get_attribute('outerHTML'))
bro.quit()
'''

# 示例四:选择 子元素(>) 和 后代元素(空格)
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample1.html')
# 查找id=container下子元素id=layer1的元素(用>号隔开)
ele = bro.find_element_by_css_selector('#container > #layer1')
print(ele.get_attribute('outerHTML'))
print('-'*50)
# 查找id=container下的后代元素(用空格隔开)
span_ele = bro.find_element_by_css_selector('#container span')
print(span_ele.get_attribute('outerHTML'))
print('-'*50)
class_ele = bro.find_element_by_css_selector('.animal span')
print(class_ele.get_attribute('outerHTML'))
bro.quit()
'''

# 示例五:[链接地址]
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample1.html')
ele = bro.find_element_by_css_selector('[href="http://www.miitbeian.gov.cn"]')
# 打印对应元素的HTML
print(ele.get_attribute('outerHTML'))
bro.quit()
'''

# 示例六:选择语法联合使用(#id > .class .class)
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample1.html')
ele = bro.find_element_by_css_selector('#bottom > .footer1 .date')
print(ele.get_attribute('outerHTML'))
print('-'*50)
# 所有span标签下属性为date的元素
# ele2 = bro.find_element_by_css_selector('#bottom > .footer1 > span.date')
ele2 = bro.find_element_by_css_selector('span.date')
print(ele2.get_attribute('outerHTML'))
bro.quit()
'''

# 示例七:组选择
'''
# tag名为div的元素 和 id为BYHY的元素,就可以像这样写
bro.get('http://cdn1.python3.vip/files/selenium/sample1a.html')
eles = bro.find_elements_by_css_selector('#t1 > span, #t1 > p, #t2 > span, #t2 > p')
for ele in eles:
print(ele.get_attribute('outerHTML'))
bro.quit()
'''

# 示例八:父元素的第n个子节点
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample1b.html')
# span:nth-child(2),父节点span下的第二个元素
eles = bro.find_elements_by_css_selector('span:nth-child(2)')
for ele in eles:
print(ele.get_attribute('outerHTML'))
print('-' * 50)
# p:nth-last-child(1),父节点p下的倒数第二个元素
ele2s = bro.find_elements_by_css_selector('p:nth-last-child(1)')
for ele in ele2s:
print(ele.get_attribute('outerHTML'))
bro.quit()
'''

# 示例九:父元素的第几个某类型的子节点
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample1b.html')
# span:nth-of-type(1)
eles = bro.find_elements_by_css_selector('span:nth-of-type(1)')
for ele in eles:
print(ele.get_attribute('outerHTML'))
bro.quit()
'''

# 示例十:frame切换
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample2.html')
"""
使用 WebDriver 对象的 switch_to 属性,像这样
wd.switch_to.frame(frame_reference)
其中, frame_reference 可以是 frame 元素的属性 name 或者 ID 。
"""
bro.implicitly_wait(5)
# 切换页面至frame
# bro.switch_to.frame('frame1') # frame1是frame的id
bro.switch_to.frame(bro.find_element_by_css_selector('[src="sample1.html"]'))
eles = bro.find_elements_by_css_selector('.plant')
for ele in eles:
print(ele.get_attribute('outerHTML'))
# 切换页面回原来的HTML
bro.switch_to_default_content()
bro.find_element_by_id('outerbutton').click()
bro.quit()
'''

# 示例十一:切换窗口
'''
bro.get('http://cdn1.python3.vip/files/selenium/sample3.html')
# mainWindow保存当前窗口的句柄
mainWindow = bro.current_window_handle
# tag_name是HTML对应的标签名
bro.find_element_by_tag_name('a').click()
# handle就是窗口的句柄
for handle in bro.window_handles:
# 先切换窗口
bro.switch_to_window(handle)
# 得到该窗口的标题栏的字符串,并判断是不是我们要操作的那个窗口
if 'Bing' in bro.title:
# 如果是,那么这个时候webdriver对象就是对应的该窗口,跳出循环
break
print(bro.title)
# 切换页面至原来窗口
bro.switch_to_window(mainWindow)
print(bro.title)
bro.quit()
'''

# 示例十二:选择框
'''
# 常见的选择框包括: radio框、checkbox框、select框
# bro.get('http://cdn1.python3.vip/files/selenium/test2.html')
# radio框(圆点选择)
# 获取当前选择的元素
# ele = bro.find_element_by_css_selector('#s_radio > input[checked="checked"]')
# print('当前选中的是:' + ele.get_attribute('value')) # 获取当前属性的值
# # 点选小雷老师
# ele1 = bro.find_element_by_css_selector('#s_radio > input[value="小雷老师"]')
# ele1.click()
# print('当前选中的是:' + ele1.get_attribute('value')) # 获取当前属性的值
# bro.quit()

# checkbox(复选勾选框)
# 我们的思路可以是这样:
# 先把 已经选中的选项全部点击一下,确保都是未选状态
# 再点击 小雷老师
# eles = bro.find_elements_by_css_selector('#s_checkbox input[checked="checked"]')
# for ele in eles:
# ele.click()
# ele1 = bro.find_element_by_css_selector('#s_checkbox input[value="小雷老师"]')
# ele1.click()
# print('当前选中的是:' + ele1.get_attribute('value'))
# 全选
# ele2 = bro.find_elements_by_css_selector('#s_checkbox input')
# for ele in ele2:
# ele.click()
# print('当前选中的是: ' + ele.get_attribute('value'))
# bro.quit()

# select框(单选/多选)
# 单选框
# # 创建Select对象
# select = Select(bro.find_element_by_id('ss_single'))
# # 通过select对象选中小雷老师
# select.select_by_visible_text('小雷老师') # 根据可见文本选择
# 多选框
# select = Select(bro.find_element_by_id('ss_multi'))
# # 清除所有已经选中的选项
# select.deselect_all()
# # 选择小江和小凯老师
# select.select_by_visible_text('小江老师')
# select.select_by_visible_text('小凯老师')
# bro.quit()
'''


# 示例十三:ActionChains
# 移动到某个元素:悬停
# bro.get('https://www.baidu.com/')
# ac = ActionChains(bro)
# ele = bro.find_element_by_name('tj_briicon')
# ac.move_to_element(ele).perform() # move到元素并perform

# 冻结页面
# 在console中执行代码“setTimeout(function(){debugger}, 5000)”

# 示例十四:弹框处理
'''
# alert、confirm、prompt
bro.get('http://cdn1.python3.vip/files/selenium/test4.html')
# 点击按钮,出现alert弹框
bro.find_element_by_id('b1').click()
print(bro.switch_to_alert().text) # 打印alert文本信息
bro.switch_to_alert().accept() # 接收弹框
# 点击按钮,出现confirm弹出框
bro.find_element_by_id('b2').click()
print(bro.switch_to_alert().text)
bro.switch_to_alert().dismiss() # 取消弹框
# 点击按钮,出现prompt弹框
bro.find_element_by_id('b3').click()
# 在弹框中输入文字信息
bro.switch_to_alert().send_keys('你好,世界!') # 在alert中send_keys
print(bro.switch_to_alert().text)
bro.switch_to_alert().accept()
'''

# 示例十五:xpath选择器
'''
# bro.get('http://cdn1.python3.vip/files/selenium/test1.html')
# 绝对路径找div
# eles = bro.find_elements_by_xpath('/html/body/div')
# for ele in eles:
# ele.click()
# print(ele.get_attribute('outerHTML'))
# //div相对路径找div
# ele2 = bro.find_elements_by_xpath('//div//p') # 找所有的div
# for ele in ele2:
# print(ele.get_attribute('outerHTML'))
# /*通配符
# ele3 = bro.find_elements_by_xpath('//div/*') # 找所有的div
# for ele in ele3:
# print(ele.get_attribute('outerHTML'))
# bro.quit()
'''

# 示例十六:其他实战技巧(窗口大小、获取窗口标题/URL、截屏)
'''
# 窗口大小:
# bro.get('https://www.baidu.com/')
# # bro.get_window_size()——获取当前窗口大小
# print(bro.get_window_size())
# # set_windows_size()——设置当前窗口的大小
# bro.set_window_size('950', '560')
# time.sleep(1)
# print(bro.get_window_size())
# bro.quit()

# 获取窗口标题/URL
# bro.get('https://www.baidu.com/')
# print(bro.title)
# print(bro.current_url)
# bro.quit()

# 截屏并保存
# bro.get('https://www.baidu.com/')
# bro.save_screenshot(r'screenshot/1.png')
# 截屏保存为图片文件
# bro.get_screenshot_as_file(r'screenshot/11.png')
# bro.quit()
'''

# 示例十七:手机模式
# 我们可以通过 desired_capabilities 参数,指定以手机模式打开chrome浏览器
'''
from selenium import webdriver
mobile_emulation = { "deviceName": "Nexus 5" } # 用adb命令:adb devices获取唯一标识
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome( desired_capabilities = chrome_options.to_capabilities())
driver.get('http://www.baidu.com')
input()
driver.quit()
'''

# 示例十八:上传文件
'''
# bro.get('https://tinypng.com/')
# # 通常,网站页面上传文件的功能,是通过 type 属性 为 file 的 HTML input 元素实现的
# # 先定位到上传文件的 input 元素
# ele = bro.find_element_by_css_selector('.target input[type="file"]')
# ele.send_keys(r"C:\Users\22648\Desktop\learn\python+selenium\selenium理论\screenshot\1.png")
'''





posted @ 2020-07-06 10:20  7喜啊  阅读(128)  评论(0)    收藏  举报