import time from selenium import webdriver import unittest import HTMLTestRunner # webDriver基本应用 class TestWebdriver(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.url = "http://www.baidu.com" def tearDown(self): self.driver.quit() def test_visitRcentURL(self): firstVisitURL = "http://www.sogou.com" secondVisitURL = "http://www.baidu.com" self.driver.get(firstVisitURL) self.driver.get(secondVisitURL) time.sleep(5) # 后退 self.driver.back() # 前进 self.driver.forward() time.sleep(5) self.driver.quit() def test_refreshCurrentPage(self): url = "http://www.soguu.com" self.driver.get(url) time.sleep(5) #刷新当前页面 self.driver.refresh() self.driver.quit() def test_maximizeWindow(self): url = "http://www.baidu.com" #最大化浏览器窗口 self.driver.get(url) self.driver.maximize_window() self.driver.quit() def test_window_position(self): url = "http://www.baidu.com" self.driver.get(url) # 获取当前浏览器在屏幕上的位置,返回的是字典 position = self.driver.get_window_position() print("当前浏览器所在位置的横坐标",position['x']) print("当前浏览器所在位置的纵坐标",position['y']) # 设置当前浏览器的屏幕上的位置 self.driver.set_window_position(x = 200,y = 400) # 获取设置后浏览器的位置 print(self.driver.get_window_position()) self.driver.quit() def test_window_size(self): url = "http://www.baidu.com" self.driver.get(url) # 获取浏览器大小,返回一个数组 sizeDict = self.driver.get_window_size() print('当前浏览器的宽',sizeDict['width']) print('当前浏览器的高',sizeDict['height']) self.driver.set_window_size(width=200,height=400,windowHandle='current') print('再次获取设置后浏览器大小', self.driver.get_window_size(windowHandle='current')) self.driver.quit() # 获取当前页面的title def test_getTitle(self): self.driver.get(self.url) print('获取当前页面的title',self.driver.title) # 获取当前页面的源码 def test_getPageSource(self): self.driver.get(self.url) # 获取当前页面的源码 pageSuurce = self.driver.page_source print(pageSuurce) self.assertEqual(u'新闻'in pageSuurce,"页面源码中未找到新闻关键字") # 获取当前页面URL地址 def test_getCurrentPageUrl(self): self.driver.get(self.url) currentUrl=self.driver.current_url print('获取当前地址',currentUrl) self.assertEqual(currentUrl,"https://www.baidu.com",'当前页面非预期') # 获取与切换浏览器窗口句柄 def test_operateWindowHandle(self): self.driver.get(self.url) # 获取当前句柄 now_handle = self.driver.current_window_handle print('获取当前句柄',now_handle) self.driver.find_element(by="id",value= "kw").send_keys("w3cschool") self.driver.find_element(by="id",value= "su").click() time.sleep(3) self.driver.find_element(by="partial link text",value="百度百科").click() time.sleep(5) # 获取所有句柄 all_handles = self.driver.window_handles print("++++++",self.driver.window_handles[-1]) for handle in all_handles: if handle == now_handle: print("句柄相同",handle) print(handle) # 获取页面元素的基本信息 def test_getBasicInfo(self): self.driver.get(self.url) newElement = self.driver.find_element(by="link text",value='新闻') # 获取新闻元素的基本信息 print('元素的标签名',newElement.tag_name) print('元素的size:',newElement.size) # 获取页面元素的文本内容 def test_getWebElementText(self): self.driver(self.url) aElement = self.driver.find_element(by="link text", value='新闻') a_text = aElement.text self.assertEqual(a_text, u'新闻') # 判断页面元素是否可见 def test_getWebElementIsDisplayed(self): self.driver.get(self.url) text = self.driver.find_element(by="link text", value='新闻') print('判断新闻是否可见',text.is_displayed()) # 判断页面元素是否可操作 def test_getWebElementIsEnabled(self): self.driver.get(self.url) text1 = self.driver.find_element(by="link text", value='新闻') print('判断新闻是否可操作',text1.is_enabled()) # 获取页面元素的属性 def test_getWebElementAttribute(self): self.driver.get(self.url) searchBox = self.driver.find_element(by="id", value="kw") print("搜索输入框name的属性值",searchBox.get_attribute('name')) searchBox.send_keys(u"上海诸毅管道工程有限公司") print('搜索框中value值',searchBox.get_attribute('value')) # 获取页面元素的css属性值 def test_getWebElementCssValue(self): self.driver.get(self.url) searchBox = self.driver.find_element(by="id", value="kw") print('搜索输入框的高度',searchBox.value_of_css_property("height")) print('搜索输入框的宽度', searchBox.value_of_css_property("width")) font = searchBox.value_of_css_property("font - family") self.assertEqual(font,"arial") # 清空输入框中的内容 def test_clearInputBoxText(self): self.driver.get(self.url) searchBox = self.driver.find_element(by="id", value="kw") searchBox.send_keys(u"上海诸毅管道工程有限公司") time.sleep(3) searchBox.clear() time.sleep(3) # 双击某个元素 def test_doubleClick(self): self.driver.get(self.url) inputBox=self.driver.find_element(by="id", value="su") # 导入支持双击操作模块 from selenium.webdriver import ActionChains # 开始双击操作 action_chains = ActionChains(self.driver) action_chains.double_click(inputBox).perform() time.sleep(3) # 操作单选下拉框 def test_printSelectText(self): url = "F:\\tset1.html" self.driver.get(url) select = self.driver.find_element_by_name('fruit') # 因为all_options是一组元素所以使用driver.find_elements_by_tag_name all_options = self.driver.find_elements_by_tag_name('option') for option in all_options: print("选项显示文本",option.text) print("选项值",option.get_attribute("value")) option.click() time.sleep(3) # 选择下拉列表元素的三种方法 def test_operateDropList(self): url = "F:\\tset1.html" self.driver.get(url) # 导入select模块 from selenium.webdriver.support.ui import Select select_element = Select(self.driver.find_element_by_xpath('//select')) print('打印默认选中的文本',select_element.first_selected_option.text) # 获取所有选择项的页面元素对象 all_options = select_element.options print('打印总个数',len(all_options)) ''' is_enabled()判断元素是否可操作 is_selected()判断元素是否被选中 ''' # 判断需要的元素是可以操作并且不被选中 if all_options[1].is_enabled() and not all_options[1].is_selected(): # 方法一:通过序号选中第二个元素,序号从0开始 select_element.select_by_index(1) print('打印已经选中的文本',select_element.all_selected_options[0].text) self.assertEqual(select_element.all_selected_options[0].text,u'西瓜') time.sleep(3) # 方法二:通过选项的显示文本选择文本为猕猴桃选项 select_element.select_by_visible_text("猕猴桃") # 断言已选中项的文本是否是猕猴桃 print('被选中的文本值',select_element.all_selected_options[0].text) self.assertEqual(select_element.all_selected_options[0].text,u'猕猴桃') time.sleep(3) # 方法三:通过选项的value属性值选择value = "shanzha"选项 select_element.select_by_value("shanzha") print('被选中的文本值',select_element.all_selected_options[0].text) self.assertEqual(select_element.all_selected_options[0].text,u'山楂') # 断言单选列表选项值 def test_checkSelectText(self): url = "F:\\tset1.html" self.driver.get(url) # 导入select模块 from selenium.webdriver.support.ui import Select select_element = Select(self.driver.find_element_by_xpath('//select')) # 获取页面中所有选项的元素对象 actual_options = select_element.options # 声明一个List对象,存储下拉列表中所期望出现的文字内容 expect_optionsList = [u"桃子",u"西瓜",u"橘子",u"猕猴桃",u"山楂",u"荔枝"] # 使用map()函数获取页面中下拉列表展示的选项内容组成的列表对象 actual_optionsList = list(map(lambda option: option.text,actual_options)) # 断言期望列表对象和实际列表对象是否完全一致 self.assertEqual(expect_optionsList,actual_optionsList) # 操作多选的选择列表 def test_operateMultipleOptionDropList(self): url = "F:\\tset2.html" self.driver.get(url) # 导入select模块 from selenium.webdriver.support.ui import Select time.sleep(2) select_element = Select(self.driver.find_element_by_xpath('//select')) # 通过序号选择第一个元素 select_element.select_by_index(0) # 通过选项的文本选择山楂选项 select_element.select_by_visible_text("山楂") # 通过选项的value属性值选择value = "mihoutao" select_element.select_by_value("mihoutao") # 打印所有的选中项 for option in select_element.all_selected_options: print('所有选中的文本:',option) # 取消所有已选中项 select_element.deselect_all() time.sleep(2) print("-------------再次选中3个选项--------------") select_element.select_by_index(1) time.sleep(2) select_element.select_by_visible_text("荔枝") select_element.select_by_value("jvzi") # 通过选项文本取消已选中的文本为"荔枝" select_element.deselect_by_visible_text("荔枝") # 通过序号取消已选中的序号为1的选项 select_element.deselect_by_index(1) # 通过选项的value属性取消已选中的value = "jvzi"的选项 select_element.deselect_by_value("jvzi") # 操作可以输入的下拉列表 def test_operateMultipleOptionDropList(self): url = "F:\\tset3.html" self.driver.get(url) from selenium.webdriver.common.keys import Keys self.driver.find_element_by_id("select").clear() time.sleep(3) # 输入的同事按下箭头键 self.driver.find_element_by_id("select").send_keys("c",Keys.ARROW_DOWN) self.driver.find_element_by_id("select").send_keys( Keys.ARROW_DOWN) self.driver.find_element_by_id("select").send_keys( Keys.ARROW_DOWN) time.sleep(3) # 操作单选框 def test_operateRadio(self): url = "F:\\tset4.html" self.driver.get(url) berryRadio = self.driver.find_element_by_xpath("//input[@value='berry']") berryRadio.click() # 断言“草莓”单选框未成功选中 self.assertTrue(berryRadio.is_selected(),u'草莓单选框未被选中') time.sleep(2) if berryRadio.is_selected(): watermelonRadio = self.driver.find_element_by_xpath("//input[@value='watermelon']") watermelonRadio.click() self.assertFalse(berryRadio.is_selected()) radioList= self.driver.find_elements_by_xpath("//input[@name = 'fruit']") for radio in radioList: print(radio.get_attribute("value")) if radio.get_attribute("value") == "orange": time.sleep(3) if not radio.is_selected(): radio.click() self.assertEqual(radio.get_attribute("value"),"orange") # 使用Title属性识别和操作新弹出的浏览器窗口 def test_identifyPopUpWindowByTitle(self): from selenium.common.exceptions import NoSuchAttributeException,TimeoutException from selenium.webdriver.support import expected_conditions as Ec from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait import traceback url = "F:\\tse5.html" self.driver.get(url) WebDriverWait(self.driver,10,0.2).until(Ec.element_to_be_clickable( (By.LINK_TEXT,'sogou搜索') )).click() all_handles = self.driver.window_handles print(self.driver.current_window_handle) print(len(all_handles)) time.sleep(3) if len(all_handles)>0: try: for windowHandle in all_handles: self.driver.switch_to.window(windowHandle) print(self.driver.title) if self.driver.title == u"搜狗搜索引擎 - 上网从搜狗开始": WebDriverWait(self.driver,10,0.2).until( lambda x: x.find_element_by_id("query")).send_keys( u"sogou首页的浏览器窗口被找到") time.sleep(2) except NoSuchAttributeException: print(traceback.print_exc()) except TimeoutException: print(traceback.print_exc()) time.sleep(3) self.driver.switch_to.window(all_handles[0]) print(self.driver.title) time.sleep(3) self.assertEqual(self.driver.title,u"你喜欢的水果") # 操作Frame中的页面元素 def test_HandleFrame(self): from selenium.webdriver.support import expected_conditions as Ec from selenium.webdriver.support.ui import WebDriverWait from selenium.common.exceptions import TimeoutException url = "F:\\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()) print('打印alert信息',alertWindow.text) alertWindow.accept() except TimeoutException: print("超时") # 使用driver.switchTo.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") time.sleep(3) 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 time.sleep(3) self.driver.switch_to.default_content() # 使用Frame中的HTML源码内容操作Frame def test_HandleFrameByPageSource(self): url = "F:\\frameset.html" self.driver.get(url) # 找到页面上的所有frame页面对象,并储存到名为framesList列表中 framesList = self.driver.find_elements_by_tag_name("frame") # 通过for循环遍历framesList中所有的frame页面,查找页面源码中含有"中间frame"的frame页面 frame = 0 for frame in range(len(framesList)): # 进入到frame页面 time.sleep(2) self.driver.switch_to.frame(frame) # 判断每个frame的HTML源码中是否包含"中间frame"几个关键字 time.sleep(2) if u"中间frame" in self.driver.page_source: # 如果包含需要查找的关键字,则查找到页面上的p标签元素 time.sleep(2) p = self.driver.find_element_by_xpath("//p") # 断言页面上p元素文本内容是否是"这只中间frame页面上的文字" time.sleep(2) self.assertAlmostEqual(u"这是中间frame页面上的文字",p.text) # 退出frame self.driver.switch_to.default_content() break else: # 如果没找到指定frame,则调用此行代码,返货到frameset页面中 # 以便下次for循环中能继续调用driver.switch_to.frame方法,否则会报错 self.driver.switch_to.default_content() if __name__ == "__main__": unittest.main() # suite = unittest.TestSuite() # suite.addTest(TestWebdriver("test_doubleClick")) # runner = unittest.TextTestRunner() # runner.run(suite)