
6.如何验证部署是否正确?【能打开浏览器-->能访问百度网站】
1. HTML页面基本结构 --> html文档头部区域,不可见 --> html文档内容部分,可见 2. 常见的页面元素: 容器型元素:div,form,table 页面元素:link,img,input(button, text, file),select(下拉框),checkbox(复选框),radio(单选框), textarea(文本域),submit(提交) web 页面基础知识: 所有的页面元素都在 html 页面中,以元素标签的形式在源码中展现出来。 标签一般有两种形式,一种是有开始结束标签的元素,比如 . 另外一种标签是自结束标 签,比如 HTML :提供了整个页面的骨架和结构,页面上有哪些元素就由 html 语言来定义。 CSS :层叠样式表。用于美化界面元素。 Javascript :定义页面元素的行为和动作。 什么样的项目适合自动化? 1.需求稳定,不会频繁变更 2.研发和维护周期长,需要频繁执行回归测试 3.需要在多种平台上重复运行相同测试的场景(兼容性) 4.性能兼容性通过手工测试无法实现,或者手工测试成本太高 5.被测试软件的开发较为规范,能够保证系统的可测试性 6.测试人员具备一定的编程能力。 driver常用代码:#在代码中常用开头
from selenium import webdriver # 导入webdriver模块
import time # 导入时间相关的库
driver = webdriver.Chrome() # 新建一个webdriver的实例
driver.maxisize_window() #最大化窗口
driver.get("https://www.baidu.com") # 打开百度首页
driver.find_element('id', 'kw').click() # 定位到id为kw的元素并点击它 driver.find_element('id', 'kw').clear() # 定位到id为kw的元素并清空里面的内容 driver.find_element('id', 'kw').send_keys('webdriver') # 定位为id为kw的元素并输入webdriver driver.find_element('id', 'su').click() # 定位到id为su的元素并点击它
time.sleep(2) # 休眠2秒 driver.close() # 关闭浏览器
#其他不太常见的 *** 作
'''获取网页源码:driver.page_source
获取窗口名称:driver.name
获取页面标题:driver.title
获取当前页面url地址:driver.current_url
获取当前页面截图:driver.get_screenshot_as_file(path)
最小化浏览器:dr.minimize_window()
设置窗口的位置: dr.set_window_position(500,500)
设置窗口的大小:dr.set_window_size(600,600)
关闭浏览器:dr.quit()
关闭当前的窗口: dr.close()
前进:dr.forward()
后退:dr.back()
刷新:dr.refresh()
获取标题:dr.title
'''
常用元素定位方法
id,
name ,
class name(特指具有class属性的元素) ,css selector,tag name ,link text ,partial link text ,
xpath
from selenium import webdriver #从selenium里面导入webdriver
import time #导入时间
driver=webdriver.Chrome() #指明浏览器用chrom浏览器
driver.maximize_window() #窗口最大化
driver.get("https://www.baidu.com") #打开网页
def func1():
driver.find_element('id','name').send_keys('saber')
def func2():
driver.find_elements('name','sex')
'''elements返回的是一个列表,所有元素是sex的列表,找不到就是空列表。
不能对列表进行直接切片,用下标进行 *** 作,如drive.find_elements('name','sex')[0].click'''
driver.find_element('name','sex') #element返回的是找到的第一个元素,没有就是None。
def func3():
driver.find_element('class name','border').send_keys('hello')
#填写多个class 【注意:空格用点号.代替】,如('class name','class1.class2.class3')--->有些classname不止一个值,以空格隔开。定位时空格改成点。
def func4():
inputs=driver.find_elements('tag name','input') #找出所有标签为input的元素
# print(len(inputs))
def func5():
driver.find_element('link text','打开百度').click() #使用link text打开超链接.
def func6():
driver.find_element('partial link text','百度').click() #使用部分匹配定位超链接
xpath是一种万能的定位方法:
def func1():
driver.find_element('xpath',"//input[@mode='sub']").send_keys('content') #元素是input,属性是mode,值是sub
def func2():
driver.find_element('xpath',"//input[@type='text'and @mode='sub']").send_keys('content')#用多个属性进行定位
def func3():
driver.find_element('xpath',"//tbody/tr[3]/td[2]/i").click() #用绝对路径定义,检查中点击元素行,copy path
def func4():
driver.find_element('xpath',"//texttera[contains(@placeholder,'introduction')]").send_keys('content')
#用模糊匹配。texttera中有placeholder中包含了introduction。
def func5():
driver.find_element('xpath',"a[text()='打开百度']").click() #文本节点,中间有个打开百度的文本。
#结合使用:
#eg:路径+模糊匹配
def func6():
driver.find_element('xpath',"//tobody/tr[contains(@placeholder,'name')]").send_keys('content')
#有相同元素和属性的可以下标表示第几个
def func7():
driver.find_element('xpath',"(//input[@mode='add'])[2]").send_keys('content')
如何才能验证写的xpath对不对?
ctrl+f,打开选择框
第二步:输入表达式,查看是否正确定位。
举例:1.上级元素是唯一的,通过相对路径来找到元素。
2.无文本内容,属性中包括唯一、有标志性的字符,而且内容很长的。
3.有文本内容的,xpath写法,(‘xpath','a[text()="内容"]'),不只是a开头的文本节点,也可以
4.在父级及以上有唯一的元素,可以通过相对路径。(和其他的xpath方法结合)
元素 *** 作:
获取元素的html : 元素对象.get_attribute("outerHTML") 【outerHTML 固定的单词】
获取元素的文本:元素对象.text
获取元素的value: 元素对象.get_attribute("value") 【输入框用的多】
获取元素的任意属性: 元素对象.get_attribute("属性值")
获取元素的标签名: 元素对象.get_attribute("tagName")
获取元素的尺寸【selenium 4 新增】:元素对象.rect
给元素输入文本:元素对象.send_keys("要输入的文本")
清空元素的文本: 元素对象.clear()
点击元素: 元素对象.click()
判断元素是否被选中:元素对象.is_selected()
判断元素是否可用:元素对象.is_enabled() ————>结构中有disabled
判断元素是否可见:元素对象.is_displayed() ————>可见:结构中有,style='dispaly:block',不可见:结构中有,style='display:none'
例如:
在已有的selenium方法不够用的时候,可以使用JS脚本来 *** 作。---->常见于时间日期的选择等。
如何用selenium执行JavaScript?
第一步:拷贝js定位:检查--定位到元素---右键:copy---copy JS path
第二步:调用,driver.exexute_script(脚本,可选的参数),几乎是万能的。-
常见的命令:1 . 滑动窗口: window.scrollTo(x方向的值,y方向的值)
2. 设置元素的value属性: js定位元素.value=新的值
3. 设置元素的text : js定位元素.textContent="新的text"
代码写法:例如:
driver.execute_script("copy来的js path.value='2022-05-20'") #给元素设置value属性,并输入值。
也可以js定位和selenium中的定位一起写。比如:
element=driver.find_element('id','springdata')
value='2014-01-01'
driver.execute_script('arguments[0].value=arguements[1]',element,value) #arguement是占位符,必须是这个单词。原理:arguments[0]=element,arguments[1]=value
设置等待时间:
1.强制/固定等待:time.sleep() 优势:用法非常简单,一般用于项目调试,或者用于等待元素状态、文本发生改变。 劣势:等待时间固定,不够灵活,如果脚本中大量使用会导致脚本运行效率低 2.隐式等待:driver.implicitly_wait(10) 设置一次后(记住:隐式等待只需设置一次), 全局有效 ,在元素没 有出现时最多只等待指定时间,但如果在等待时间内,什么时候元素 出现什么时候停止等待。 注意,隐式等待只能解决NoSuchElementException这种异常,也就 是因为元素不存在引起的异常,因为其他原因导致的问题无法解决。 3.显式等待 可针对每一个元素进行单独设置 ,等待条件更加灵活。---最长等待时间 注意:如果显式等待和隐式等待同时设置,以最长等待时间为准。 常见EC方法 title_is(strtitle):判断当前页面的title是否精确等于预期 title_contains(strtitle): 判断当前页面title是否包含指定字符串 presence_of_element_located(locator) :判断某个元素是否被加到了dom树里,并不代表该元素一定可见 visibility_of_element_located(locator):判断某个元素是否肉眼可见,可见代表元素非隐藏,并且元素的宽和高都不等于0 invisibility_of_element_located(locator):判断某个元素是否不可见 element_to_be_clickable(locator):判断某个元素中是否可见并且 是enable的,这样的话才叫clickable text_to_be_present_in_element(locator):判断某个元素中的text 是否包含了预期的字符串from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
login=WecDriverWait(driver,10,0.5).until(EC.title_contains('百度知道'))
#driver是webdiver.chrome()的对象,10是最长等待时间,0。5是每0.5秒去查询对应的元素。
#util后面跟等待的具体条件。EC表示判断,表示在10秒内,每0.5秒就去查询一次对应的元素,直到标题含有百度知道,再去进行下一步。如果十秒内没有出现,则报错。
Webdriver常用API-元素 *** 作
clear:清除文本框内的文字
send_keys:向文本域或文件上传按钮发送文字内容
click:点击按钮
text:获取对象的文本节点信息,如果该对象没有文本节点,则为空
get_attribute(name):获取元素指定的属性信息
is_displayed:判断元素是否显示出来
Webdriver执行JS,滚动页面
driver.get('https://www.baidu.com')
driver.maximize_window()
driver.find_element('id', 'kw').send_keys('python')
driver.find_element('id', 'su').click()
time.sleep(1)
driver.execute_script('window.scrollTo(0, 3000);') #纵向滚动,从0到3000
#解决问题---》element is not attached to page document
下拉列表:
from selenium.webdriver.support.ui import Select
Select (driver.find_element('id','name')).select_by_visible_text('小明') #下拉框的定位在id=name,用文本选择小明
Select (driver.find_element('id','name')).select_by_value('50') #用value属性来选择
Select (driver.find_element('id','name')).select_by_index(1) #用下标来选择,选择下标为1的值。
#随机选择一个:
#第一种:
options=driver.find_elements(By.XPATH,"//selecet/option")
random.chioce(options).click() #随机选择一个进行点击
time.sleep(2)
#第二种
select_element=driver.find_element(By.ID,"city")
my_city_select=Select(select_element) #必须是Select元素
options=my_city_select.options
random.choice(options).click() #随机选择一个进行点击
报错及其解决方法:
element not interactable exception:元素不可交互异常
1.该元素的属性的值不只一个地方
2.元素的属性或者值写错了。
3.一般是由于元素在界面上不可见,或者被遮挡引起的。(被隐藏,或者窗口未完全打开,找不到)被隐藏-----》.is_display,查看是否展现;窗口被遮挡----->maxisize_window)
No suchelementexception:
1.检查代码是否写对。(尤其注意大小写)
2.设置隐性等待
3.检查目标元素是否包含在iframe中
4.检查目标元素是否在多窗口中。
iframe *** 作:
#1、先切进来,找到元素
#切换并进入的方法:dr.switch_to.frame( ID 或 name 或 index )
[1]dr.switch_to.frame("baidu") #通过id
[2]dr.switch_to.frame("zhidao") #通过name
[3]dr.switch_to.frame(0) #通过index 从0开始的
[4]dr.switch_to.frame( 定位的iframe元素 )
如:driver.swich_to.frame(driver.find_element('id','login_frame')).send_keys()
#2.再切出去,切到最外面
driver.switch_to.default_content()
#3.其他 *** 作--->切换到上一级的方法:dr.switch_to.parent_frame()
alert窗---->d窗,且右键没有检查,无法通过元素定位:先点击click,一旦出现d窗,必须先处理d窗的内容
driver.switch_to.alert #切入到d窗里
print(driver.switch_to.alert .text) #打印d窗里的内容
driver.switch_to.alert.accept() #点击确定按钮
driver.switch_to.alert.dismiss() #点击取消按钮
dr.switch_to.alert.send_keys("想要输入的文本") #在d窗中输入文本
文件上传:
driver.find_element('xpath',"//input[@type='file']").send_keys(绝对路径)
多窗口 *** 作:
from selenium import webdriver
curhandle = driver.current_window_handle #获取当前窗口
allhandles = driver.window_handles #获取所有窗口,是一个列表
#print(allhandles)
for handle in allhandles: #循环判断窗口是否为当前窗口
if handle != curhandle: #不是当前窗口即进行切换.
driver.switch_to.window(handle) #切换过去
driver.find_element_by_id('test_id1').click() #切过去的 *** 作
driver.close()
driver.switch_to.window(curhandle) #切换回来,断续进行其它 *** 作
driver.find_element_by_id('test_id2').click()
driver.switch_to.window(driver.window_handles[1]) #切到第二个窗口
定位悬浮类(鼠标放在上面出现,有提示;鼠标移走,消失)--->导入动作链
import ActionChains #导入动作链
setting=driver.find_element('id','name') #浮点的定位
ActionChains(driver).move_to_element(setting)
perform()
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)