等待、键盘事件、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()
在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的内容对比。一般用于验证一个文本信息或错误的提示信息。
如下,以新浪邮箱登录页面为例,当账号和密码为空,点击登录按钮,验证页面返回的错误提示信息是否为“请输入邮箱名”:

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

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()
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
1、浏览器滑动:

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

3、时间控件:
那么我们需要填写时间的属性,具体解决问题的步骤为:
1、取消时间控件的只读属性
2、取消只读属性后,操作input控件的value,其实我们知道input里面输入的内容最终是在value的属性里面。


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





浙公网安备 33010602011771号