1、select 元素定位
select元素定位主要用于有下拉选择的地方,基本步骤:
1.引入Select
from selenium.webdriver.support.select import Select
2.select 实例化
s=Select(元素地址)
3.给控件赋予内容
s.select_by_index(索引) s.select_by_value('value') s.select_by_visible_text(文本内容)
eg:从指定网页下拉列表选择地址
from selenium.webdreiver.support.select import Select
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get('https://www.')
s=Select(driver.find_element(By.ID,'province'))
s.select_by_index(3)
# time.sleep(1)
c=Select(driver.find_element(By.ID,'city'))
c.select_by_value('637')
# time.sleep(1)
d=Select(driver.find_element(By.ID,'district'))
d.select_by_visible_text('长安区')
# time.sleep(1)
t=Select(driver.find_element(By.ID,'twon'))
t.select_by_value('641')
2、鼠标
鼠标事件,click()是模拟鼠标的单击操作,现在的web产品中提供了更丰富的交互方式,例如鼠标右击、双击、悬停、甚至是鼠标拖动等功能。
WebDriver中,这些方法封装在ActionChains类中,需要导入以下包:
from selenium.webdriver.common.action_chains import ActionChains
常见的方法有:
ActionChains中存储的行为:
perform():执行所有
context_click():右击
double_click():双击
drag_and_drop():拖动
move_to_element():鼠标悬停
eg:鼠标悬停
ac=ActionChains(driver)
ac.move_to_element(driver.find_element(By.XPATH,"//div[@class='u-dt']/child::span"))
ac.perform()
3、键盘
键盘事件,Keys()类提供了键盘上几乎所有的按键的方法。send_keys()方法可以用来模拟键盘输入,除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键,如Ctrl+A,Ctrl+C等,需要导入以下包:from selenium.webdriver.common.keys import keys
Send_keys(Keys.Back_SPACE):删除键
Send_keys(Keys.SPACE):空格键
Send_keys(Keys.TAB):制表键
Send_keys(Keys.ESCAPE):esc键
Send_keys(Keys.ENTER):回车键
Send_keys(Keys.CONTROL,’a’):全选
Send_keys(Keys.CONTROL,’c’):复制
Send_keys(Keys.CONTROL,’x’):剪切
Send_keys(Keys.CONTROL,’v’):粘贴
'''
实例:
1.登录http://testingedu.com.cn:8000/Home/user/login.html
2.在搜索框中输入“手机”
3.生成鼠标后双击搜索框,停止4秒后单击搜索按钮
'''
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://testingedu.com.cn:8000/Home/user/login.html')
driver.find_element(By.XPATH,"//input[@class='text_cmu'][1]").send_keys('123456')
time.sleep(2)
driver.find_element(By.XPATH,"//input[@class='text_cmu'][1]").send_keys(Keys.CONTROL,'a')
time.sleep(2)
driver.find_element(By.XPATH,"//input[@class='text_cmu'][1]").send_keys(Keys.CONTROL,'x')
time.sleep(2)
driver.find_element(By.XPATH,"//input[@class='text_cmu'][1]").send_keys('13800138006')
time.sleep(2)
driver.find_element(By.XPATH,"//input[ @id='password']").send_keys(Keys.CONTROL,'v')
time.sleep(2)
driver.find_element(By.XPATH,"//input[ @id='verify_code']").send_keys('1234')
driver.find_element(By.XPATH,"//a[@class='J-login-submit']").click()
time.sleep(2)
driver.find_element(By.ID,'q').send_keys('手机')
ac=ActionChains(driver)
ac.double_click(driver.find_element(By.ID,'q'))
ac.perform()
time.sleep(4)
ac.click(driver.find_element(By.LINK_TEXT,"搜索"))
ac.perform()
4、等待方式
如今很多web都在使用AJAX技术,运用这种技术的软件当浏览器加载页面时,页面上的元素可能不会被同步加载完成,如此一来,定位元素时就会出现困难。我们可以通过设置元素等待来改善这类问题导致的测试脚本不稳定
WebDriver提供了三种种元素等待方式:
隐式等待(implicitly)
是全局等待方式,设置了一个等待时间,如果在等待时间内,网页已加载完成会继续往下执行,超过时间没有加载完成也会往下执行
eg: driver.implicitly_wait(30)
显式等待
就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就抛出Exception。(简而言之,就是直到元素出现才去操作,如果超时则报异常)
需要先引入以下包: from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as ec
使用方法:
WebDriverWait(浏览器,需要等待的时间,时间间隔检查).until(ec.函数((By.查找方式,'value')))
expected_conditions--显示等待常用函数:
title_is() 判断当前页面的title是否完全与预期字符串相等,结果为True或False
title_contains() 判断当前页面的title是否包含与预期字符串,返回布尔值
url_contains() 判断当前页面的url是否包含与预期字符串,返回布尔值
url_changes() 判断当前页面的url是否改变,返回布尔值
url_to_be() 判断当前页面的url是否完全与预期字符串相等,返回布尔值
presence_of_all_elements_located()
判断是否至少有1个元素存在于dom树中,只要有一个存在,结果返回TRUE
presence_of_elements_located() 判断元素是否被加到dom树,并不代表该元素一定可见
visibility_of_element_located() 判断元素是否可见
visibility_of() 判断元素是否可见,参数为定位后的元素
text_to_be_present_in_element() 判断某个元素中的text是否包含了预期的字符串
text_to_be_present_in_element_value()
判断某个元素中的value属性是否包含了预期的字符串
frame_to_be_available_and_switch_to_it()
判断该frame是否可以Switch进去,如果可以的话返回True并且Switch进去,否则返回FALSE
invisibility_of_element_located() 判断某个元素中不存在于dom树或不可见
element_to_be_clickable() 判断某个元素中是否可见并且可点击
stateness_of() 等某个元素从dom树中移除,返回布尔值
element_selection_state_to_be() 判断某个元素选中状态是否符合预期
element_to_be_selected() 判断某个元素是否被选中,一般用在下拉列表
element_located_selection_state_to_be() 判断某个元素是否符合预期
alter_is_present() 判断页面上是否存在alter
强制等待
不管浏览器有没有加载完成,都得等待给定的时间,超过等待时间没有加载完成也也会继续往下执行,会严重影响代码的执行速度
需要导入以下包:
from time import sleep
sleep(s)
5、网页嵌套
在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位 这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
比如腾讯qq邮箱的用户信息提交模块就是嵌套处理的,如果想要输入用户名、密码信息就要切换表单才可以
进入frame:
driver.switch_to.frame('id/name/xpath')
出frame:
driver.switch_to.parent_frame('id/name/xpath')
回到最初页面:
driver.switch_to.default_frame('id/name/xpath')
实例:登录QQ邮箱并发送邮件
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://mail.qq.com/')
#上台阶
driver.switch_to.frame('login_frame')
driver.find_element(By.ID,'u').send_keys('账号')
driver.find_element(By.ID,'p').send_keys('密码')
driver.find_element(By.ID,'login_button').click()
# 离开login_frame
driver.switch_to.default_content()
# 等待一秒
time.sleep(1)
# 定位写信按钮
driver.find_element(By.XPATH,'//*[@id="composebtn"]').click()
# 切换到mainFrame
driver.switch_to.frame('mainFrame')
time.sleep(1)
# 定位收件人,并输入[email protected]
driver.find_element(By.XPATH,'//*[@id="toAreaCtrl"]/div[2]/input').send_keys('[email protected]',Keys.ENTER)
time.sleep(1)
# 定位主题,并输入
driver.find_element(By.XPATH,'//*[@id="subject"]').send_keys("来自zhang发来的邮件")
# 定位邮件正文,先进入到iframe
driver.switch_to.frame(driver.find_element(By.XPATH,'//*[@class="qmEditorIfrmEditArea"]'))
# 先点击正文,再send_keys
driver.find_element(By.XPATH,'/html/body').click()
driver.find_element(By.XPATH,'/html/body').send_keys("Hello World","\nzhang")
# 返回到mainframe
driver.switch_to.parent_frame()
# 定位发送按钮
driver.find_element(By.XPATH,'//*[@name="sendbtn"]').click()
time.sleep(5)
#关闭浏览器
driver.quit()
版权归原作者 zr6486 所有, 如有侵权,请联系我们删除。