十一.javascript语言学习

(一)浏览器顶端底端的滑动

浏览器的滑动主要分为浏览器的向上和向下,比如我们就以百度搜索引擎为案例,我们进行关键字的搜索后,想点几下一步的操作,但是下一步无法展示出来,就需要把页面滑动到底部才可以展示出来。下面通过实际的案例来演示下这部分的具体应用,案例代码如下:

from selenium.webdriver.common.by import By
from selenium import webdriver
import time


driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.baidu.com')
time.sleep(1)

driver.find_element(By.ID,'kw').send_keys('刘亦菲 梦华录')
time.sleep(2)
driver.find_element(By.ID,'su').click()
time.sleep(2)

#浏览器页面滑动到底端
js="var q=document.documentElement.scrollTop=10000"
#调用js语言
driver.execute_script(js)
time.sleep(2)
#浏览器滑动到顶端
js1="var q=document.documentElement.scrollTop=0"
#调用js语言
driver.execute_script(js1)
time.sleep(2)

driver.close()

(二)富文本的输入

现在互联网的产品基本都会使用到富文本的信息,针对富文本的特性,其实我们有两个思路来实现元素的定位方式,一种是iframe的思路,另外一种是JS的方式。如下具体显示富文本的信息:

from selenium import webdriver
import time



def richText(driver,content):
  '''
  实现在富文本里面输入内容
  :param driver: webdriver实例化后的对象信息
  :param content: 富文本里面需要输入的文字内容
  :return:
  '''
  js="document.getElementById('ueditor_0').contentWindow.document.body.innerHTML='{0}'".format(content)
  driver.execute_script(js)


driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://uutool.cn/ueditor/')
driver.implicitly_wait(30)
time.sleep(6)
richText(driver=driver,content='刘亦菲是仙女!')
time.sleep(3)
driver.close()

(三)时间组件

下面具体来看时间控件的处理,时间控件很多时候是只读属性,具体见如下的HTML的代码:

 

 

 

在如上的代码中可以很清晰的看到它是只读属性,那么我们需要填写时间的属性,具体解决问题的步骤为:

  • 取消时间控件的只读属性

  • 取消只读属性后,操作input控件的value,其实我们知道input里面输入的内容最终是在value的属性里面。

下面通过具体的代码来实现这部分,实现在时间控件中填写我们想选择的时间,具体实现的代码为:

from selenium import webdriver
import time

def startTime(driver,content):
  '''开始时间控件'''
  js="$(\"input[placeholder='开始时间≥当前时间']\").removeAttr('readonly');" \
     "$(\"input[placeholder='开始时间≥当前时间']\").attr('value','{0}')".format(content)
  driver.execute_script(js)

def endTime(driver,content):
  '''结束时间控件'''
  js="$(\"input[placeholder='结束时间>开始时间']\").removeAttr('readonly');" \
     "$(\"input[placeholder='结束时间>开始时间']\").attr('value','{0}')".format(content)
  driver.execute_script(js)



driver=webdriver.Chrome()
driver.maximize_window()
#路径每次可能会有变化,打开以后再复制一次路径
driver.get('file:///C:/Users/%E5%B0%8F%E5%A6%96%E5%A5%B3/AppData/Local/Temp/HZ$D.533.4186/HZ$D.533.4187/Time/index.html')
time.sleep(2)
startTime(driver=driver,content='2020-1-14 00:00:00')
time.sleep(2)
endTime(driver=driver,content='2022-4-1 23:59:59')
time.sleep(2)
driver.close()

十二.数据驱动

在UI的自动化测试中,我们需要把测试使用到的数据分离到文件中,如果单纯的写在我们的测试模块里面,不是一个好的设计,所以不管是什么类型的自动化测试,都是需要把数据分离出来的。当然分离到具体的文件里面,文件的形式其实有很多的,这里主要说明JSON的文件和YAML的文件在UI自动化测试中的应用。

(一)JSON文件

JSON库主要应用于序列化以及反序列化中,特别是在API的自动化测试中,序列化以及反序列化是知识体系里面必须需要掌握的技术栈的体系。当然我们也是可以针对文件进行序列话和反序列化的处理,针对文件的序列化可以简单的理解为就是把第三方的数据写到文件里面,使用JSON库里面的方法是dump(),那么针对文件的反对序列化可以理解为是从文件中读取数据,那么使用到的JSON库里面的load()的方法,下面主要是针对UI自动化测试的数据进行分离,原始代码为:

以qq为例:

写好预断言的qq.json

from selenium.webdriver.common.by import By
from selenium import webdriver
import time
import  json

def jsonRead():
    return json.load(open('qq.json','r',encoding='utf-8'))
    
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://file.qq.com/')
time.sleep(2)
driver.implicitly_wait(30)

#从二维码登录切换到密码登录,属于是iframe页面
driver.switch_to.frame('login_frame1')
driver.switch_to.frame('ptlogin_iframe')
driver.find_element(By.ID,'switcher_plogin').click()
time.sleep(2)

#不输入用户名直接登录
driver.find_element(By.ID,'login_button').click()
time.sleep(1)
devTest=driver.find_element(By.XPATH,'//*[@id="err_m"]')
#断言.如果内容无误断言还是不成功,输出文本和断言内容,把输出的文本内容复制到文本文件内内再执行
print(devTest.text)
print(jsonRead()["usernameNull"])
assert devTest.text==jsonRead()["usernameNull"]

driver.refresh()
#从二维码登录切换到密码登录,属于是iframe页面
driver.switch_to.frame('login_frame1')
driver.switch_to.frame('ptlogin_iframe')
driver.find_element(By.ID,'switcher_plogin').click()
time.sleep(2)
driver.find_element(By.ID,'u').send_keys('456')
time.sleep(2)
driver.find_element(By.ID,'login_button').click()
time.sleep(1)
#分离后断言
devTest=driver.find_element(By.XPATH,'//*[@id="err_m"]')
print(devTest.text)
print(jsonRead()["usernameerror"])
assert devTest.text==jsonRead()["usernameerror"]
time.sleep(2)

driver.close()

(二)YAML文件

下面我们演示把测试数据存储到YAML文件里面,以QQ登录为例,进行了窗口切换,验证登录和注册

综合练习:

from selenium.webdriver.common.by import By
from selenium import webdriver
import time
import yaml

def readYaml():
    with open('qq.yaml','r',encoding='utf-8') as z:
        return yaml.safe_load(z)


driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://file.qq.com/')
time.sleep(1)
driver.implicitly_wait(30)

#从二维码登录切换到密码登录,属于是iframe页面
driver.switch_to.frame('login_frame1')
driver.switch_to.frame('ptlogin_iframe')
driver.find_element(By.ID,'switcher_plogin').click()
time.sleep(1)

#不输入用户名直接登录
driver.find_element(By.ID,'login_button').click()
time.sleep(1)
devTest=driver.find_element(By.XPATH,'//*[@id="err_m"]')
#断言
assert devTest.text==readYaml()['qq']['usernameNull']
time.sleep(1)

driver.refresh()
#从二维码登录切换到密码登录,属于是iframe页面
driver.switch_to.frame('login_frame1')
driver.switch_to.frame('ptlogin_iframe')
driver.find_element(By.ID,'switcher_plogin').click()
time.sleep(1)
#输入错误用户名
driver.find_element(By.ID,'u').send_keys('456')
time.sleep(1)
driver.find_element(By.ID,'login_button').click()
time.sleep(1)
#断言
devTest=driver.find_element(By.XPATH,'//*[@id="err_m"]')
assert devTest.text==readYaml()['qq']['usernameerror']
time.sleep(1)


#切换页面到注册登录页面
nowHandler=driver.current_window_handle
driver.find_element(By.LINK_TEXT,'注册帐号').click()
time.sleep(2)
#获取所有的窗口
allHandlers=driver.window_handles
#对所有的窗口循环
for handler in allHandlers:
    if handler!=nowHandler:
        driver.switch_to.window(handler)
        time.sleep(2)

driver.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[1]/form/div[1]/div[2]/input').send_keys('')
driver.find_element(By.XPATH,'//*[@id="password"]').send_keys('124567890000000')
time.sleep(2)
driver.find_element(By.ID,'phone').send_keys('bn')
time.sleep(2)
driver.find_element(By.ID,'get_acc').click()
time.sleep(1)
#
devTest1=driver.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[1]/form/div[1]/div[3]/div')
devTest2=driver.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[1]/form/div[2]/div[4]/div')
devTest3=driver.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[1]/form/div[3]/div[2]/div')
devTest4=driver.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[1]/form/div[4]/div[2]/div')
devTest5=driver.find_element(By.XPATH,'/html/body/div[3]/div[2]/div[1]/form/div[6]/div/div')
time.sleep(2)
assert devTest1.text==readYaml()['qq']["qqname"]
assert devTest2.text==readYaml()["qq"]["password"]
assert devTest3.text==readYaml()["qq"]["phone"]
assert devTest4.text==readYaml()["qq"]["yanzheng"]
assert devTest5.text==readYaml()["qq"]["privace"]
time.sleep(3)

driver.switch_to.window(nowHandler)

driver.close()