Selenium Webdriver API(8)
Selenium Webdriver API(8)
40、操作frame中的元素 switch_to.frame
#encoding=utf-8 import time import unittest from selenium import webdriver class visitLocalWebByIe(unittest.TestCase): def setUp(self): #启动浏览器 self.driver = webdriver.Ie(executable_path = "D:\\IEDriverServer") def test_HandleFrame(self): #导入显式等待类 from selenium.webdriver.support.ui import WebDriverWait #导入期望场景类 from selenium.webdriver.support import expected_conditions as EC #导入异常类 from selenium.common.exceptions import TimeoutException url = "http://127.0.0.1:8080/frameset.html" #访问自定义网页 self.driver.get(url) #使用索引方式进入指定的frame页面,索引号从0开始 #所以想进入中间的frame,需要使用索引号1 #如果没有使用此行代码,则无法找到页面中左侧的frame中的任何页面元素 self.driver.switch_to.frame(0) #找到左侧frame中的p标签元素 leftFrameText = self.driver.find_element_by_xpath("//p") #断言左侧frame中的文字是否和“这是左侧frame页面上的文字”几个关键字想一致 self.assertAlmostEqual(leftFrameText.text,u"这是左侧 frame 页面上的文字") #找到左侧frame中的按钮元素,并单击该元素 self.driver.find_element_by_tag_name("input").click() try: #动态等待alert窗体出现 alertWindow = WebDriverWait(self.driver,10).until(EC.alert_is_present()) #打印alert信息 print alertWindow.text alertWindow.accept() #等同于点击确定 except TimeoutException,e: print e #使用driver.switch_to.default_content方法从左侧frame中返回到frameset页面 #如果不调用此行代码,则无法从左侧frame页面中直接进入其他frame页面 self.driver.switch_to.default_content() #通过标签名找到页面中所有的frame元素,然后通过索引进入该frame self.driver.switch_to.frame(self.driver.find_elements_by_tag_name("frame")[1]) #断言页面源码中是否存在“这是中间frame页面上的文字”关键字串 assert u"这是中间 frame 页面上的文字" in self.driver.page_source #在输入框中输入“我在中间frame” self.driver.find_element_by_tag_name("input").send_keys(u"我在中间frame") self.driver.switch_to.default_content() self.driver.switch_to.frame(self.driver.find_element_by_id("rightframe")) assert u"这是右侧 frame 页面上的文字" in self.driver.page_source self.driver.switch_to.default_content() self.driver.switch_to.frame("rightframe") assert u"这是右侧 frame 页面上的文字" in self.driver.page_source self.driver.switch_to.default_content() def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()
41、使用frame源码定位frame
#encoding=utf-8 import time import unittest from selenium import webdriver class visitLocalFrameByIe(unittest.TestCase): def setUp(self): #启动浏览器 self.driver = webdriver.Ie(executable_path = "D:\\IEDriverServer") def test_HandleFrameByPageSource(self): url = "http://127.0.0.1:8080/frameset.html" #访问自定义网页 self.driver.get(url) #找到页面所有的frame页面元素对象,并存储到名为frameList列表中 frameList = self.driver.find_elements_by_tag_name("frame") #通过for循环遍历frameList中所有的frame页面,查找页面源码中含有“中间 frame”的frame页面 for frame in frameList: #进入frame页面 self.driver.switch_to.frame(frame) #判断每个frame的HTML源码中是否包含“中间 frame”几关键字 if u"中间 frame" in self.driver.page_source: #如果包含需要查找的关键字,则查找到页面上的p标签元素 p = self.driver.find_element_by_xpath("//p") #断言页面上p 元素文本内容是否是“这是中间 frame 页面上的文字” self.assertAlmostEqual(u"这是中间 frame 页面上的文字",p.text) #退出frame self.driver.switch_to.default_content() #找到指定的frame页面,并做相应的操作后退出循环 break else: #如果没有找到指定的frame,则调用此行代码,返回到frameset页面中 #以便下次for循环中给继续调用driver.switch_to.frame方法,否则会报错 self.driver.switch_to.default_content() def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()
42、操作iframe
#encoding=utf-8 import time import unittest from selenium import webdriver class visitLocalIframeByIe(unittest.TestCase): def setUp(self): #启动浏览器 self.driver = webdriver.Ie(executable_path = "D:\\IEDriverServer") def test_HandleIFrame(self): url = "http://127.0.0.1:8080/frameset.html" #访问自定义网页 self.driver.get(url) #改变操作区域,进入页面上的第一个frame,也就是左侧的frame self.driver.switch_to.frame(self.driver.find_element_by_id("leftframe")) #断言页面是否存在“这是左侧 frame 页面上的文字”关键字串,以判断是否成功切换进frame页面 assert u"这是左侧 frame 页面上的文字" in self.driver.page_source #改变操作区域,切换进入id为showIfame的iframe页面 self.driver.switch_to.frame(self.driver.find_element_by_id("showIfame")) #断言页面是否存在“这是 iframe 页面上的文字”这样的关键字串,以便判断是否成功切换进iframe assert u"这是iframe页面上的文字" in self.driver.page_source #将操作区域切换到frameset页面,以便能成功进入其他frame self.driver.switch_to.default_content() #断言页面的title值 是否 为“frame 页面” assert u"frameset 页面" == self.driver.title #改变操作区域,进入中间frame self.driver.switch_to.frame(1) #断言页面上是否存在 “这是中间 frame 页面上的文字”这样的关键字串 assert u"这是中间 frame 页面上的文字" in self.driver.page_source def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()
43、操作JavaScript的Alert弹窗
#encoding=utf-8 import time import unittest from selenium import webdriver class visitLocalAlertByIe(unittest.TestCase): def setUp(self): #启动浏览器 self.driver = webdriver.Ie(executable_path = "D:\\IEDriverServer") def test_HandleAlert(self): #导入异常类 from selenium.common.exceptions import NoAlertPresentException url = "http://127.0.0.1:8080/test_alert.html" #访问自定义网页 self.driver.get(url) #通过id属性值找到页面上的按钮元素 button = self.driver.find_element_by_id("button") #单击按钮元素,则会弹出一个Alert消息框,上面显示“这是一个 alert 弹出框” button.click() try: #使用driver.switch_to.alert方法获取alert对象 alert = self.driver.switch_to.alert time.sleep(2) #使用alert.text属性获取alert框中的内容,并断言文字内容是否是“这是一个 alert 弹出框” self.assertEqual(alert.text,u"这是一个 alert 弹出框") #调用alert对象的accept()方法,模拟鼠标单击alert弹窗上的“确定”按钮,以便关闭弹出框 alert.accept() except NoAlertPresentException,e: #如果Alert框未弹出显示在页面上,则会抛出NoALertPresentException的异常 self.fail(u"尝试操作的alert框未找到") print e def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()