selenium3+python⾃动化7-switch_to总结(2020-02-1417:
35)
⼀、前⾔
这次主要整理⼀下最近遇到过跟switch_to有关的内容,包含切窗⼝、切框架、切弹框。将相同的知识点放在⼀起⽅便后期查阅和管理,后续若遇到新的内容便继续更新。
⼆、多窗⼝、句柄(handle)的切换
1.点击某个元素后,会打开⼀个新的窗⼝,多个窗⼝之间如何切换?
2.浏览器窗⼝的属性⽤句柄(handle)来识别,
获取当前页⾯的句柄:driver.current_window_handle
获取所有的句柄:driver.window_handles ,所有句柄是⼀个list列表,如果要切换到具体的窗⼝使⽤索引值即可,每打开⼀个新窗⼝,索引值就增加⼀个,先打开的窗⼝索引值为0。
3.切换句柄:driver.switch_to.window(所有句柄[索引值])
例如:获取所有句柄:handles=driver.window_handles
   切换⾄第⼀个窗⼝:driver.switch_to.window(handles[0])
   切换⾄第⼆个窗⼝:driver.switch_to.window(handles[1]).
4.检验切换窗⼝是否正确,切换窗⼝后可以打印title看与预期是否⼀致。打印title⽤print(driver.title)
5.以注册百度账号为例,打开百度——点击“登录”,出现⼆维码——点击⼆维码下⾯的“⽴即注册”——打开⼀个新的窗⼝:注册窗⼝
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
<("www.baidu/")
driver.implicitly_wait(10)
driver.find_element_by_link_text("登录").click()
sleep(1)
driver.find_element_by_link_text("⽴即注册").click()
sleep(1)
#获取当前句柄并打印
handle=driver.current_window_handle
print(handle)
#获取所有句柄并打印
handles=driver.window_handles
print(handles,type(handles),len(handles))
#切换句柄
driver.switch_to.window(handles[0])
print(driver.title)#获取切换后的title值进⾏检验
driver.quit()
运⾏结果:
⼆、切框架(iframe/frame)
1.frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,⽽frame与iframe对selenium定位⽽⾔是⼀样的,selenium有⼀组⽅法对frame进⾏操作。(补充内容20200217)frame是整个页⾯的框架,iframe是内嵌的页⾯元素。
2.iframe的切换默认是id和name,若没有就需要先定位到iframe再进⾏切换。总之:有id或者name就直接切换,没有就先定位再切换。
3.切换框架:driver.switch_to.frame(id/name/定位到的iframe)
 切⾄主框架:driver.switch_to.default_content()
 切⾄⽗框架:driver.switch_to.parent_frame()
注意:有多级框架时,框架必须⼀级⼀级往下切换,不可逐级。
  换框架的时候必须切换⾄主框架或者⽗框架再进⼊新的框架,不能在上⼀个框架基础上直接切换⾄新的框架。
4.实际应⽤(补充内容20200217)
⽬标:将“55”链接内容中的“附⾔”打印出来。①打开标题为“55”的链接,定位“55”链接发现在多个框架中,frameset⽆需切换。其余框架需逐
级切换。②“附⾔”在另⼀个多级框架中,牵扯换框架。第⼀个框架没有id/name,⼜牵扯到框架定位。
代码如下:
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
<("localhost:8080/oa/login.jsp")
driver.implicitly_wait(10)
#登录
elements=driver.find_elements_by_class_name('loginInput')
elements[0].send_keys("xxx")
elements[1].send_keys("xxxxx")
driver.find_element_by_id("button_submit").click()
sleep(3)
#在已发事项中打开“55”链接
driver.find_element_by_link_text("已发事项").click()
driver.switch_to.frame('iframe_main')
# driver.switch_to.frame('listFrameSet')#frameset框架不⽤切换,否则报错
driver.switch_to.frame('listframe')
driver.find_element_by_xpath('//*[@id="__gt_FGrid_r_4281581329959307847"]/td[3]/div/a').click()
sleep(3)
#打开链接后打印“附⾔”,涉及换框架
driver.switch_to.default_content()
iframe=driver.find_element_by_xpath('//*[contains(@src,"/oa/jsp/collaborate/view/index.jsp?viewType=view&uuid=")]')
driver.switch_to.frame(iframe)
driver.switch_to.frame('iframe_content')
fuyan=driver.find_element_by_xpath('//*[@id="descriptionDiv"]/div[2]')
)
driver.quit()
三、切弹框(alert/confim/prompt)
1.认识alert/confim/prompt弹框的样式。借助园主的代码,如下代码复制⾄记事本中,将记事本后缀改为.html,⽤浏览器打开即可观察每种弹框样式。
<html>
<head>
<title>Alert</title>
</head>
<body>
<input id = "alert" value = "alert" type = "button" onclick = "alert('您关注了yoyoketang吗?');"/>
<input id = "confirm" value = "confirm" type = "button" onclick = "confirm('确定关注:yoyoketang?');"/>
<input id = "prompt" value = "prompt" type = "button" onclick = "var name = prompt('请输⼊:','yoyoketang');
document.write(name) "/>
xpath语法 python
</body>
</html>
2.三种弹框操作⽅法:
text:获取⽂本值
accept():点击“确认”
dismiss():点击“取消”或者关闭对话框
send_keys():输⼊值--仅限prompt,在alert和confirm上没有输⼊框
3.切弹框:先到弹框的触发按钮点击操作,再切⼊弹框中,进⾏上述操作⽅法。
切弹框:driver.switch_to.alert
4.实战
4.1以上⾯给出的源代码为例,进⾏练习。
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
<('C:\\Users\\张全\Desktop\\tankuang.html')
driver.implicitly_wait(10)
#1 alert弹框
driver.find_element_by_id("alert").click()
t1=driver.switch_to.alert
)
t1.accept()
# t1.dismiss()
sleep(2)
#2 confirm弹框
driver.find_element_by_id("confirm").click()
t2=driver.switch_to.alert
)
t2.accept()
# t2.dismiss()
sleep(2)
#3 prompt弹框
driver.find_element_by_id("prompt").click()
t3=driver.switch_to.alert
)
t3.send_keys("否")
t3.accept()
# t3.dismiss()
sleep(2)
driver.quit()
运⾏结果:
4.2以百度设置每页演⽰页数为例:打开百度,点击“设置”——点击“搜索设置”——设置每页显⽰条数——点击“保存设置”便出现⼀个弹框。from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
<("www.baidu/")
driver.implicitly_wait(10)
#3 ⿏标操作-百度设置按钮
from selenium.webdrivermon.action_chains import ActionChains
shezhi=driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(shezhi).perform()
sleep(1)
driver.find_element_by_xpath('//*[@class="bdpfmenu"]/a[1]').click()#点击搜索设置
sleep(1)
#4 select下拉框-设置页中页码显⽰设置(接3代码)
#4.1⼆次定位:先定位下拉框,再定位选项
# s=driver.find_element_by_id('nr')
# s.find_element_by_xpath('//option[@value="20"]').click()
# 4.2直接定位选项
# driver.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
#4.3 select模块
from selenium.webdriver.support.select import Select
s=driver.find_element_by_id("nr")
Select(s).select_by_index(1)
sleep(1)
Select(s).select_by_value("50")
sleep(1)
Select(s).select_by_visible_text("每页显⽰20条")
sleep(1)
driver.find_element_by_link_text("保存设置").click()
sleep(1)
#5 切弹框(接4代码)
t=driver.switch_to.alert
)#打印弹框⽂本
# t.accept()#确认对话框
t.dismiss()#取消或关闭对话框
sleep(3)
driver.quit()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。