等待、键盘事件、JS操作

一、等待

 1 from selenium import webdriver
 2 from selenium.webdriver.support.ui import WebDriverWait
 3 from selenium.webdriver.support import expected_conditions as es
 4 from selenium.webdriver.common.by import By
 5 import time as t
 6 
 7 '''隐式等待'''
 8 driver=webdriver.Chrome()
 9 driver.maximize_window()
10 driver.get("http://www.baidu.com")
11 driver.implicitly_wait(10)        #以秒为单位,表示我最多可以等60秒,如果超过这个时间就报超时
12 driver.quit()
13 
14 
15 '''显式等待'''
16 '''element_to_be_clickable():元素可见时进行操作'''
17 driver=webdriver.Chrome()
18 driver.maximize_window()
19 driver.get("http://www.baidu.com")
20 driver.implicitly_wait(60)
21 so=WebDriverWait(driver=driver,timeout=10).until(method=es.element_to_be_clickable((By.ID,"kw")))
22 so.send_keys("软件测试")
23 print("输入的关键字:",so.get_attribute("value"))
24 driver.quit()
25 
26 '''text_to_be_present_in_element()元素的文本资源加载出来,与_text的内容对比'''
27 driver=webdriver.Chrome()
28 driver.maximize_window()
29 driver.get("https://mail.sina.com.cn/")    #新浪邮箱
30 driver.implicitly_wait(60)                  #隐式等待60秒
31 driver.find_element_by_class_name("loginBtn").click()    #点击登录按钮
32 t.sleep(5)
33 divText=WebDriverWait(driver=driver,timeout=10).until(method=es.text_to_be_present_in_element(
34     (By.XPATH,"/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]"),
35     text_="请输入邮箱名"))
36 driver.quit()
37 
38 '''visibility_of_element_located()判断元素是否可见'''
39 driver=webdriver.Chrome()
40 driver.maximize_window()
41 driver.get("http://www.baidu.com/")    #打开百度首页
42 driver.implicitly_wait(60)          #隐式等待60秒
43 t.sleep(5)
44 about=WebDriverWait(driver=driver,timeout=10).until(method=es.visibility_of_element_located(
45     (By.LINK_TEXT,"关于百度")
46 ))
47 print(about.text)
48 about.click()
49 t.sleep(3)
50 driver.quit()
View Code

 

在UI自动化测试中,关于等待的部分,主要汇总如下三点:(面试必问)

1、固定等待,也就是使用time.sleep()方法。
2、隐式等待,使用到的方法是implicitly_wait的方法,可以把它理解为设置最长能等待的时间。
隐式等待是全局有效,只需要声明一次,一般在打开浏览器后进行声明。抛出找不到元素这个异常。
3、显式等待,主要指的是程序每隔一段时间执行自定义的程序判断条件,如果判断成立,程序就会继续执行,那么如果判断失败,
就会报TimeOutExpection的异常信息。需要在某个需要等待的元素前面进行声明。

在使用场景上:可以使用隐式等待来做一个全局的控制,例如设置全局隐式等待6秒;显式等待多了一个指定元素条件超时时间,如果某个控件比较特殊,需要更长的时间加载,比如十几秒或者更长,就可以使用显示等待对其进行单独处理;

 

(经常是三者搭配起来使用)

1、固定等待:

import time 先导入

time.sleep(5) 刻意等待5秒

 

2、隐式等待

(工作中一般都要加上隐式等待和窗口自动化)

driver.implicitly_wait()

 以秒为单位,表示我最多可以等待的时间是60秒,就不去刻意的等待一个准确的时间点了,程序在这个时间内都算正常运行,如果超过这个时间就报超时。

 

3、显式等待:

有一个判断的过程,设定一个时间,判断当资源在这个时间内加载完成了,就进行一个操作。

在UI的自动化测试中,显式等待主要使用的是类WebDriverWait,它里面提供了很多的解决方案,下面具体对它进行分析,我们要使用它,那么我们就首先需要导入:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as es
from selenium.webdriver.common.by import By
import time as t

 在它的源代码中,可以看到构造函数有两个形式我们需要刻意的关注,一个是driver,还有另外一个是timeout,其实driver就是webdriver实例化后的对象信息,timeout指的是具体等待的时间,单位是秒,在WebDriverWait的类里面,调用的方法具体为:until方法

WebDriverWait(driver=,timout=,).until(method=)

在until的方法里面,参数method指的是需要调用的方法,其实这个方法是调用expected_conditions中模块中的函数或者是方法,那么导入它的方式具体为,也就是说WebDriverWait会与expected_conditions模块结合起来应用。

 

应用1:element_to_be_clickable():元素可见时进行操作

判断某元素可见后(加载出来)执行输入、点击等操作。

如下,设定十秒时间,当百度输入框可见时,进行操作。

 (until是一个WebDriverWait的方法,method是until的形式参数,method中调用的是es模块中的方法)

 

应用2:text_to_be_present_in_element()

定位元素、元素的文本资源加载出来后,与_text的内容对比。一般用于验证一个文本信息或错误的提示信息。

如下,以新浪邮箱登录页面为例,当账号和密码为空,点击登录按钮,验证页面返回的错误提示信息是否为“请输入邮箱名”:

 

应用3:visibility_of_element_located()判断元素是否可见

等元素可见后再执行操作,以“关于百度”为例,如果“关于百度”可见,则输出它的文本。

 

 

二、键盘事件

Keys

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time as t
driver=webdriver.Chrome()
driver.implicitly_wait(30)
driver.get("http://www.baidu.com")
so=driver.find_element_by_id("kw")
so.send_keys("软件测试")
#全部选择输入的关键字
so.send_keys(Keys.CONTROL,"a")
t.sleep(3)
#然后复制
so.send_keys(Keys.CONTROL,"c")
t.sleep(3)
#然后删除
so.send_keys(Keys.BACKSPACE)
t.sleep(3)
#然后粘贴关键字
so.send_keys(Keys.CONTROL,"v")
t.sleep(3)
#此处F12操作无效(因电脑而异)
so.send_keys(Keys.F12)
t.sleep(3)
driver.quit()
View Code

 from selenium.webdriver.common.keys import Keys

元素.send_keys(Keys.CONTROL,"a")

元素.send_keys(Keys.CONTROL,"c")

元素.send_keys(Keys.CONTROL,"v")

元素.send_keys(Keys.BACKSPACE)

 把输入框定义为一个变量so,然后使用 so.send_keys(Keys.CONTROL,"a")

 

三、JS操作

 1 mport time
 2 from selenium import webdriver
 3 import time as t
 4 '''浏览器滑动'''
 5 driver=webdriver.Chrome()
 6 driver.maximize_window()
 7 driver.get("https://www.zhipin.com/xian/?sid=sem_pz_bdpc_dasou_title")
 8 driver.implicitly_wait(30)
 9 driver.find_element_by_name("query").send_keys("软件测试")
10 driver.find_element_by_xpath("/html/body/div[1]/div[3]/div/div[1]/div[1]/form/button").click()
11 t.sleep(3)
12 #浏览器滑动到底部
13 down="var q=document.documentElement.scrollTop=1000"
14 driver.execute_script(down)
15 t.sleep(3)
16 #点击下一页
17 driver.find_element_by_class_name("next").click()
18 t.sleep(5)
19 driver.execute_script(down)
20 t.sleep(5)
21 #浏览器滑动到顶部
22 up="var q=document.documentElement.scrollTop=0"
23 driver.execute_script(up)
24 t.sleep(3)
25 driver.quit()
26 
27 
28 '''iFrame方式富文本'''
29 driver=webdriver.Chrome()
30 driver.maximize_window()
31 driver.get("https://uutool.cn/ueditor/")
32 driver.implicitly_wait(30)
33 driver.switch_to.frame("ueditor_0")
34 t.sleep(3)
35 driver.find_element_by_xpath("/html/body").send_keys("123432")
36 time.sleep(3)
37 driver.quit()
38 
39 '''JS方式富文本'''
40 
41 '''时间控件'''
42 def startTime(driver,content):
43   '''开始时间控件'''
44   js="$(\"input[placeholder='开始时间≥当前时间']\").removeAttr('readonly');" \
45      "$(\"input[placeholder='开始时间≥当前时间']\").attr('value','{0}')".format(content)
46   driver.execute_script(js)
47 
48 
49 def endTime(driver,content):
50   '''结束时间控件'''
51   js="$(\"input[placeholder='结束时间>开始时间']\").removeAttr('readonly');" \
52      "$(\"input[placeholder='结束时间>开始时间']\").attr('value','{0}')".format(content)
53   driver.execute_script(js)
54 
55 driver=webdriver.Chrome()
56 driver.maximize_window()
57 driver.get("file:///D:/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E5%AD%A6%E4%B9%A0/%E5%B7%A5%E5%85%B7/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95html%E6%96%87%E4%BB%B6/Time/%E6%97%B6%E9%97%B4%E6%8E%A7%E4%BB%B6.html")
58 startTime(driver=driver,content='2000-01-01 00:00')
59 t.sleep(3)
60 endTime(driver=driver,content="2022-1-15 00:00")
61 t.sleep(3)
62 # driver.get_screenshot_as_file(filename="asd.png")
63 driver.qui
View Code

 

1、浏览器滑动:

 

 

2、富文本:

https://uutool.cn/ueditor/

富文本:就是能写内容,加载图片,和表格的。比如博客园的

 

 

3、时间控件:

那么我们需要填写时间的属性,具体解决问题的步骤为:

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

 

 

 (工作中把蓝框中的内容进行修改,具体的:在页面定位的代码(源码)中找value placeholder)

posted @ 2022-04-08 16:12  jia---  阅读(216)  评论(0)    收藏  举报