多选彷佛也比较随意马虎,依次定位须要选择的元素,点击即可。
下拉框下拉框的操作相对繁芜一些,须要用到Select模块。
先导入该类

from selenium.webdriver.support.select import Select
在select模块中有以下定位方法
'''1、三种选择某一选项项的方法'''select_by_index() # 通过索引定位;把稳:index索引是从“0”开始。select_by_value() # 通过value值定位,value标签的属性值。select_by_visible_text() # 通过文本值定位,即显示不才拉框的值。'''2、三种返回options信息的方法'''options # 返回select元素所有的optionsall_selected_options # 返回select元素中所有已选中的选项first_selected_options # 返回select元素中选中的第一个选项 '''3、四种取消选中项的方法'''deselect_all # 取消全部的已选择项deselect_by_index # 取消已选中的索引项deselect_by_value # 取消已选中的value值deselect_by_visible_text # 取消已选中的文本值
测试页面
<html><body><form><select name="球"><option value="篮球">篮球</option><option value="足球" selected="">足球</option><option value="排球">排球</option><option value="羽毛球">羽毛球</option></select></form></body></html>
然后,再演示下拉框的不同选择的办法
from selenium import webdriverfrom selenium.webdriver.support.select import Selectimport timeurl = 'file:///C:/Users/Gdc/Desktop/ball.html'browser = webdriver.Chrome()browser.get(url)time.sleep(2)# 根据索引选择Select(browser.find_element_by_name("球")).select_by_index("2")time.sleep(2)# 根据value值选择Select(browser.find_element_by_name("球")).select_by_value("羽毛球")time.sleep(2)# 根据文本值选择Select(browser.find_element_by_name("球")).select_by_visible_text("足球")time.sleep(2)# 关闭浏览器browser.close()
多窗口切换之Frame切换
Selenium打开一个页面之后,默认是在父页面进行操作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则须要切换到子页面进行擦走,这时候switch_to.frame()就来了。如果想回到父页面,用switch_to.parent_frame()即可。
仿照鼠标操作之左键、右键与双击既然是仿照浏览器操作,自然也就须要能仿照鼠标的一些操作了,这里须要导入ActionChains 类。
from selenium.webdriver.common.action_chains import ActionChains
左键
这个实在便是页面交互操作中的点击click()操作。
右键
context_click()
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 定位到要右击的元素,这里选的新闻链接right_click = browser.find_element_by_link_text('新闻')# 实行鼠标右键操作ActionChains(browser).context_click(right_click).perform()time.sleep(2)# 关闭浏览器browser.close()
在上述操作中
ActionChains(browser):调用ActionChains()类,并将浏览器驱动browser作为参数传入context_click(right_click):仿照鼠标双击,须要传入指定元素定位作为参数perform():实行ActionChains()中储存的所有操作,可以看做是实行之前一系列的操作
双击
double_click()
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverimport time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 定位到要双击的元素double_click = browser.find_element_by_css_selector('#bottom_layer > div > p:nth-child(8) > span')# 双击ActionChains(browser).double_click(double_click).perform()time.sleep(15)# 关闭浏览器browser.close()
仿照鼠标操作之拖拽
drag_and_drop(source,target)拖拽操作嘛,开始位置和结束位置须要被指定,这个常用于滑块类验证码的操作之类。
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverimport time browser = webdriver.Chrome()url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'browser.get(url) time.sleep(2)browser.switch_to.frame('iframeResult')# 开始位置source = browser.find_element_by_css_selector("#draggable")# 结束位置target = browser.find_element_by_css_selector("#droppable")# 实行元素的拖放操作actions = ActionChains(browser)actions.drag_and_drop(source, target)actions.perform()# 拖拽time.sleep(15)# 关闭浏览器browser.close()
仿照鼠标操作之悬停move_to_element
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverimport time browser = webdriver.Chrome()url = 'https://www.baidu.com'browser.get(url) time.sleep(2)# 定位悬停的位置move = browser.find_element_by_css_selector("#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap > span.soutu-btn")# 悬停操作ActionChains(browser).move_to_element(move).perform()time.sleep(5)# 关闭浏览器browser.close()
仿照键盘操作
selenium中的Keys()类供应了大部分的键盘操作方法,通过send_keys()方法来仿照键盘上的按键。
引入Keys类
from selenium.webdriver.common.keys import Keys
常见的键盘操作
send_keys(Keys.BACK_SPACE):删除键(BackSpace)
send_keys(Keys.SPACE):空格键(Space)
send_keys(Keys.TAB):制表键(TAB)
send_keys(Keys.ESCAPE):回退键(ESCAPE)
send_keys(Keys.ENTER):回车键(ENTER)
send_keys(Keys.CONTRL,'a'):全选(Ctrl+A)
send_keys(Keys.CONTRL,'c'):复制(Ctrl+C)
send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)
send_keys(Keys.CONTRL,'v'):粘贴(Ctrl+V)
send_keys(Keys.F1):键盘F1
send_keys(Keys.F12):键盘F12
实例操作演示:
定位须要操作的元素,然后操作即可!
from selenium.webdriver.common.keys import Keysfrom selenium import webdriverimport timebrowser = webdriver.Chrome()url = 'https://www.baidu.com'browser.get(url) time.sleep(2)# 定位搜索框input = browser.find_element_by_class_name('s_ipt')# 输入pythoninput.send_keys('python')time.sleep(2)# 回车input.send_keys(Keys.ENTER)time.sleep(5)# 关闭浏览器browser.close()
延时等待
如果碰着利用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候考试测验在get方法实行完成时获取网页源代码可能并非浏览器完备加载完成的页面。以是,这种情形下须要设置延时等待一定韶光,确保全部节点都加载出来。
等待有三种办法:逼迫等待、隐式等待和显式等待
1.逼迫等待
直接time.sleep(n)逼迫等待n秒,在实行get方法之后实行。
2.隐式等待
implicitly_wait()设置等待韶光,如果到韶光有元素节点没有加载出来,就会抛出非常。
from selenium import webdriverbrowser = webdriver.Chrome()# 隐式等待,等待韶光10秒browser.implicitly_wait(10) browser.get('https://www.baidu.com')print(browser.current_url)print(browser.title)# 关闭浏览器browser.close()
3. 显式等待
设置一个等待韶光和一个条件,在规定韶光内,每隔一段韶光查看下条件是否成立,如果成立那么程序就连续实行,否则就抛出一个超时非常。
from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byimport timebrowser = webdriver.Chrome()browser.get('https://www.baidu.com')# 设置等待韶光10swait = WebDriverWait(browser, 10)# 设置判断条件:等待id='kw'的元素加载完成input = wait.until(EC.presence_of_element_located((By.ID, 'kw')))# 在关键词输入:关键词input.send_keys('Python')# 关闭浏览器time.sleep(2)browser.close()
WebDriverWait的参数解释:
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver: 浏览器驱动
timeout: 超时时间,等待的最永劫光(同时要考虑隐性等待韶光)
poll_frequency: 每次检测的间隔韶光,默认是0.5秒
ignored_exceptions:超时后的非常信息,默认情形下抛出NoSuchElementException非常
until(method,message='')
method: 在等待期间,每隔一段韶光调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入非常
until_not(method,message='')
until_not 与until相反,until是当某元素涌现或什么条件成立则连续实行,until_not是当某元素消逝或什么条件不成立则连续实行,参数也相同。
其他等待条件
from selenium.webdriver.support import expected_conditions as EC# 判断标题是否和预期的同等title_is# 判断标题中是否包含预期的字符串title_contains# 判断指定元素是否加载出来presence_of_element_located# 判断所有元素是否加载完成presence_of_all_elements_located# 判断某个元素是否可见. 可见代表元素非隐蔽,并且元素的宽和高都不即是0,传入参数是元组类型的locatorvisibility_of_element_located# 判断元素是否可见,传入参数是定位后的元素WebElementvisibility_of# 判断某个元素是否不可见,或是否不存在于DOM树invisibility_of_element_located# 判断元素的 text 是否包含预期字符串text_to_be_present_in_element# 判断元素的 value 是否包含预期字符串text_to_be_present_in_element_value#判断frame是否可切入,可传入locator元组或者直接传入定位办法:id、name、index或WebElementframe_to_be_available_and_switch_to_it#判断是否有alert涌现alert_is_present#判断元素是否可点击element_to_be_clickable# 判断元素是否当选中,一样平常用不才拉列表,传入WebElement工具element_to_be_selected# 判断元素是否当选中element_located_to_be_selected# 判断元素的选中状态是否和预期同等,传入参数:定位后的元素,相等返回True,否则返回Falseelement_selection_state_to_be# 判断元素的选中状态是否和预期同等,传入参数:元素的定位,相等返回True,否则返回Falseelement_located_selection_state_to_be#判断一个元素是否仍在DOM中,传入WebElement工具,可以判断页面是否刷新了staleness_of
运行JavaScript
还有一些操作,比如下拉进度条,仿照javaScript,利用execute_script方法来实现。
from selenium import webdriverbrowser = webdriver.Chrome()# 知乎创造页browser.get('https://www.zhihu.com/explore')browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')browser.execute_script('alert("To Bottom")')
Cookie
在selenium利用过程中,还可以很方便对Cookie进行获取、添加与删除等操作。
from selenium import webdriverbrowser = webdriver.Chrome()# 知乎创造页browser.get('https://www.zhihu.com/explore')# 获取cookieprint(f'Cookies的值:{browser.get_cookies()}')# 添加cookiebrowser.add_cookie({'name':'球类', 'value':'足球'})print(f'添加后Cookies的值:{browser.get_cookies()}')# 删除cookiebrowser.delete_all_cookies()print(f'删除后Cookies的值:{browser.get_cookies()}')
输出:
Cookies的值:[{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com', ...]添加后Cookies的值:[{'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '球类', 'path': '/', 'secure': True, 'value': '足球'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com',...]删除后Cookies的值:[]
希望本文对你有所帮助~~如果对软件测试、接口测试、自动化测试、口试履历互换感兴趣可以私聊我或关注"大众年夜众号“特斯汀软件测试”。免费领取最新软件测试大厂口试资料和Python自动化、接口、框架搭建学习资料!
技能大牛解惑答疑,同行一起互换。