selenium 全天课整理(二)
# encoding=utf-8 ''' selenium 全天 二 ''' #unittest例子 from selenium import webdriver import unittest,time from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains class VisitSogouBaiduByChrome(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path='f:\\chromedriver') self.url1= 'https://www.baidu.com' self.url2 = 'https://cn.bing.com' self.wwait=WebDriverWait(self.driver,10,0.4) def test_visit_baidu(self): self.driver.get(self.url1) print('当前网页为:', self.driver.current_url) self.wwait.until(lambda x:x.find_element_by_id('kw')).send_keys('我是谁') self.wwait.until(lambda x:x.find_element_by_id('su')).click() time.sleep(3) assert '成龙' in self.driver.page_source def test_visit_bing(self): self.driver.get(self.url2) print('当前网页为:', self.driver.current_url) self.wwait.until(lambda x:x.find_element_by_id('sb_form_q')).send_keys('猫鼠游戏') self.wwait.until(lambda x:x.find_element_by_id('sb_form_go')).click() time.sleep(3) assert '莱昂纳多' in self.driver.page_source def tearDown(self): self.driver.quit() if __name__=='__main__': unittest.main() ''' #执行的顺序: set_up #每个test的初始化 test_visitsogou #方法名称必须test开头 teardown set_up test_visitbaidu teardown #每个test的结束执行 ''' ************************selenium API 基本操作 ************************* #页面后退、前进 driver.back() driver.forward() #页面刷新 driver.refresh() #强制刷新 不使用浏览器的缓存 #页面最大化 driver.maximize_window() #获取、设置窗口的坐标 左上角 0,0 往右+100 往下+200 driver.get_window_position() #设置窗口大小self.driver.get_window_size()、self.driver.set_window_size() driver.get_window_size() driver.set_window_size(width = 200, height = 400, windowHandle='current') driver.get_window_size(windowHandle='current') #窗口的名称 driver.title #获取到网页的源码,比http协议requests获取的源码全,js都可以执行后获取 driver.page_source #获取当前页面的url driver.current_url ********************************切换不同窗口 window_handles,driver.switch_to.window(now_handle)******************** import unittest import time import chardet from selenium import webdriver class VisitSogouByIE(unittest.TestCase): def setUp(self): # 启动IE浏览器 self.driver = webdriver.Chrome(executable_path="f:\\chromedriver") def test_operateWindowHandle(self): url = "https://www.baidu.com" self.driver.get(url) # 获取当前窗口句柄 now_handle = self.driver.current_window_handle # 百度搜索输入框中输入“w3cschool” self.driver.find_element_by_id("kw").send_keys("w3cschool") # 点击搜索按钮 self.driver.find_element_by_id("su").click() time.sleep(3) # 点击w3school在线教育链接 self.driver.find_element_by_xpath("//*[@id='2']/h3/a").click() time.sleep(5) print("++++", self.driver.window_handles) # 循环遍历所有新打开的窗口句柄,也就是说不包括主窗口 for handle in self.driver.window_handles: if handle != now_handle: # 切换窗口 self.driver.switch_to.window(handle) #切换窗口,也可以用下面的方法,但此种方法在selenium3.x以后官方已经不推荐使用了self.driver.switch_to_window(handle) # 点击HTML5链接 self.driver.find_element_by_link_text('HTML5').click() time.sleep(3) # 关闭当前的窗口 self.driver.close() # 不能用self.driver.quit() 否则整个浏览器会退出 time.sleep(3) # 返回主窗口 self.driver.switch_to.window(now_handle) time.sleep(2) self.driver.find_element_by_id("kw").clear() self.driver.find_element_by_id("kw").send_keys(u"光荣之路自动化测试培训") self.driver.find_element_by_id("su").click() time.sleep(5) def tearDown(self): # 退出浏览器 self.driver.quit() if __name__ == '__main__': unittest.main() **********************************另一种方式切换不同的窗口,window_handles,判断driver.title==""********************** import unittest import time from selenium import webdriver class VisitSogouByIE(unittest.TestCase): def setUp(self): # 启动chrome浏览器 self.driver = webdriver.Chrome(executable_path="f:\\chromedriver") def test_operateWindowHandle(self): url = "http://www.baidu.com" self.driver.get(url) # 获取当前窗口句柄 now_handle = self.driver.current_window_handle # 百度搜索输入框中输入“w3cschool” self.driver.find_element_by_id("kw").send_keys("w3cschool") # 点击搜索按钮 self.driver.find_element_by_id("su").click() time.sleep(3) # 点击w3school在线教育链接 self.driver.find_element_by_xpath("//*[@id='2']/h3/a").click() time.sleep(5) # 获取所有窗口句柄 all_handles = self.driver.window_handles # 循环遍历所有新打开的窗口句柄,也就是说不包括主窗口 for handle in all_handles: self.driver.switch_to.window(handle) if self.driver.title == "w3school 在线教程": # 点击HTML5链接 self.driver.find_element_by_link_text('HTML5').click() time.sleep(3) if self.driver.title == "w3cschool_百度搜索": time.sleep(2) self.driver.find_element_by_id("kw").clear() self.driver.find_element_by_id("kw").send_keys("我是谁") self.driver.find_element_by_id("su").click() time.sleep(5) def tearDown(self): # 退出IE浏览器 self.driver.quit() if __name__ == '__main__': unittest.main() ******************************组合按键keyDown(keyName)、keyUp(keyName)********************* import win32api import win32con import time VK_CODE ={ 'enter':0x0D, 'ctrl':0x11, 'a':0x41, 'v':0x56, 'x':0x58, 't':0x54 } #键盘键按下 def keyDown(keyName): win32api.keybd_event(VK_CODE[keyName], 0, 0, 0) #键盘键抬起 def keyUp(keyName): win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0) #(方法1)浏览器新开一个窗口 ctrl+t keyDown('ctrl') keyDown('t') keyUp('t') keyUp('ctrl') #(方法2) 浏览器新开一个窗口 open_window='window.open("http://www.baidu.com");' #新开一个空白窗口 open_window='window.open();' driver.execute_script(open_window) #获取元素的属性 news_element=driver.find_element_by_xpath("//*[text()='新闻']") print("元素的标签名:", newsElement.tag_name) print("元素的size:", newsElement.size) print("元素的文本:",newsElement.text) print("元素的链接:",newsElement.get_attribute("href")) print("元素的链接:", newsElement.get_property("href")) #判断元素是否可见 div2.is_displayed() #判断元素是否可操作,及通过 js 修改元素可操作 input1.is_enabled() driver.execute_script("document.getElementById('input2').disabled=false;") #获取页面文本框输入的内容 input_box=driver.find_element_by_id("kw") input_box.send_keys("w3cschool") print(input_box.get_attribute('value')) #获取页面元素的css的属性值 searchBox =driver.find_element_by_id("kw") # 使用页面元素对象的value_of_css_property()方法获取元素的CSS属性值 print (u"搜索输入框的高度是:", searchBox.value_of_css_property("height")) print (u"搜索输入框的宽度是:", searchBox.value_of_css_property("width")) font = searchBox.value_of_css_property("font-family") print (u"搜索输入框的字体是:", font) # 断言搜索输入框的字体是否是arial字体 assert font=="arial" #文本框清空 input_box.clear() #页面元素双击 from selenium.webdriver import ActionChains ActionChains(driver).double_click(inputBox).perform() #操作下拉框(普通方式) select = self.driver.find_element_by_name("fruit") all_options = select.find_elements_by_tag_name("option") #注意这个返回列表 for option in all_options: print (u"选项显示的文本:", option.text) print (u"选项值为:", option.get_attribute("value")) option.click() *************************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 #下拉框已选择的所有选项 select_element.all_selected_options #选择选项的三种方式 #通过序号 select_element.select_by_index(1) #通过选项的显示文本 select_element.select_by_visible_text("猕猴桃") #通过选项的value属性值 select_element.select_by_value("shanzha") #多选框的操作同上面下拉框 # 取消所有已选中项 select_element.deselect_all() select_element.select_by_index(1) select_element.select_by_visible_text("荔枝") select_element.select_by_value("juzi") # 通过选项文本取消已选中的文本为“荔枝”选项 select_element.deselect_by_visible_text("荔枝") # 通过序号取消已选中的序号为1的选项 select_element.deselect_by_index(1) # 通过选项的value属性值取消已选中的value=“juzi”的选项 select_element.deselect_by_value("juzi") #可以输入内容筛选的下拉框,选择提示的下拉内容,只支持IE from selenium.webdriver.common.keys import Keys driver.find_element_by_id("select").send_keys("c") #根据输入,下拉框提示筛选结果 driver.find_element_by_id("select").send_keys( Keys.ARROW_DOWN) #按向下键 选择结果 driver.find_element_by_id("select").send_keys( Keys.ARROW_DOWN) driver.find_element_by_id("select").send_keys( Keys.ENTER) #单选框的操作,直接通过xpath定位,然后click() berryRadio = driver.find_element_by_xpath("//input[@value='berry']") # 点击选择“草莓”选项 berryRadio.click() #复选框操作,直接通过xpath定位,然后click()选中,再次click()取消选择 berryCheckBox = self.driver.find_element_by_xpath("//input[@value='berry']") # 点击选择“草莓”选项 berryCheckBox.click() #断言,assert assert "首页" in driver.page_source, "页面源码中不存在该关键字!" #如果断言失败,提示的错误信息 *****************************浏览器内部,截屏get_screen_shot_as_file(filepath)*********************** result = driver.get_screenshot_as_file(r"e:\screenPicture.png") print (result) #成功返回True #截图 不只是浏览器 屏幕都可以截图,不能滚屏 from PIL import ImageGrab im=ImageGrab.grab() im.save("e:\\1.jpg","jpeg") #创建当前日期(年月日)的目录,然后截图(时分秒.png)存到目录 import os import os.path import time from selenium import webdriver urls=["http://www.baidu.com","http://www.sogou.com","http://cn.bing.com"] dir_name=time.strftime("%Y-%m-%d",time.localtime()) if not os.path.exists("e:\\"+dir_name): os.mkdir("e:\\"+dir_name) driver = webdriver.Ie(executable_path = "f:\\IEDriverServer") os.chdir("e:\\"+dir_name) for url in urls: driver.get(url) driver.get_screenshot_as_file(time.strftime("%H-%M-%S",time.localtime())+".png") ************************************页面元素拖拽***************************** import unittest import time import chardet from selenium import webdriver class VisitSogouByIE(unittest.TestCase): def setUp(self): #启动IE浏览器 #self.driver = webdriver.Firefox(executable_path = "e:\\geckodriver") #self.driver = webdriver.Ie(executable_path = "f:\\IEDriverServer") self.driver = webdriver.Chrome(executable_path = "f:\\chromedriver") def test_dragPageElement(self): url = "http://jqueryui.com/resources/demos/draggable/scroll.html" # 访问被测试网页 self.driver.get(url) # 获取页面上第一个能拖拽的页面元素 initialPosition = self.driver.find_element_by_id("draggable") # 获取页面上第二个能拖拽的页面元素 targetPosition = self.driver.find_element_by_id("draggable2") # 获取页面上第三个能拖拽的页面元素 dragElement = self.driver.find_element_by_id("draggable3") # 导入提供拖拽元素方法的模块ActionChains from selenium.webdriver import ActionChains import time """ 创建一个新的ActionChains,将webdriver实例对象driver作为参数值传入 然后通过WebDriver实例执行用户动作。 """ action_chains = ActionChains(self.driver) # 将页面上第一个能被拖拽的元素拖拽到第二个元素位置 action_chains.drag_and_drop(initialPosition, targetPosition).perform() # 将页面上第三个能拖拽的元素,向右下拖动10个像素,共拖动5次 for i in range(5): action_chains.drag_and_drop_by_offset(dragElement, 10, 10).perform() time.sleep(2) def tearDown(self): # 退出IE浏览器 self.driver.quit() if __name__ == '__main__': unittest.main() ********************************页面的键盘事件 send_keys(Keys.ENTER)************************* from selenium.webdriver.common.keys import Keys input_box.send_keys(Keys.F12) #IE浏览器打开调试模式 input_box.send_keys("selenium") #点击回车键 # 或者使用query.send_keys(Keys.RETURN) query.send_keys(Keys.ENTER) **********************键盘事件 的例子************************ import unittest from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys import win32clipboard as w import win32con import time import win32api # 读取剪切板 def getText(): w.OpenClipboard() d = w.GetClipboardData(win32con.CF_TEXT) w.CloseClipboard() return d # 设置剪切板内容 def setText(aString): w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_UNICODETEXT, aString) w.CloseClipboard() VK_CODE ={ 'enter':0x0D, 'ctrl':0x11, 'a':0x41, 'v':0x56, 'x':0x58 } #键盘键按下 def keyDown(keyName): win32api.keybd_event(VK_CODE[keyName], 0, 0, 0) #键盘键抬起 def keyUp(keyName): win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0) content = '我是谁' # 将content变量中的内容设置到剪切板中 setText(content) # 从剪切板中获取刚设置到剪切板中的内容 getContent = getText() print ("剪切板中的内容:",getContent.decode("gbk")) #注意需要转换字符串类型 # 将焦点切换到搜索输入框中 driver.find_element_by_id("kw").click() keyDown('ctrl') keyDown('v') # 释放Ctrl + v组合键 keyUp('v') keyUp('ctrl') # 点击“百度一下”搜索按钮 self.driver.find_element_by_id('su').click() ********************** ActionChains 执行ctrl+a ctrl+x ctrl+v**************************** import unittest import time import chardet from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys ActionChains(driver).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform() #ctrl+a ActionChains(driver).key_down(Keys.CONTROL).send_keys('x').key_up(Keys.CONTROL).perform() #ctrl+x driver.get(url) driver.find_element_by_id("kw").click() # 模拟Ctrl + V组合键,将从剪切板中获取到的内容粘贴到搜索输入框中 ActionChains(driver).key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform() #ctrl+v # 点击“百度一下”搜索按钮 self.driver.find_element_by_id('su').click() **********************************利用win32的方式 实现上述例子************************* import unittest import time import chardet from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys # 导入模拟组合按键需要的包 import win32api import win32con import time VK_CODE ={ 'enter':0x0D, 'ctrl':0x11, 'a':0x41, 'v':0x56, 'x':0x58, 't':0x54 } #键盘键按下 def keyDown(keyName): win32api.keybd_event(VK_CODE[keyName], 0, 0, 0) #键盘键抬起 def keyUp(keyName): win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0) # 模拟Ctrl + a,选中输入框中所有的内容 keyDown('ctrl') keyDown('a') # 释放Ctrl + a组合键 keyUp('a') keyUp('ctrl') # 模拟Ctrl + x剪切所选中的内容 keyDown('ctrl') keyDown('x') keyUp('x') keyUp('ctrl') # 访问百度首页 self.driver.get("http://www.baidu.com") # 将焦点切换到搜索输入框中 self.driver.find_element_by_id("kw").click() # 模拟Ctrl + v组合键,进行粘贴 keyDown("ctrl") keyDown("v") keyUp('v') keyUp('ctrl') # 模拟回车键 keyDown('enter') keyUp('enter') ******************************************键盘所有按键的清单*********************************** VK_CODE = { 'backspace': 0x08, 'tab': 0x09, 'clear': 0x0C, 'enter': 0x0D, 'shift': 0x10, 'ctrl': 0x11, 'alt': 0x12, 'pause': 0x13, 'caps_lock': 0x14, 'esc': 0x1B, 'spacebar': 0x20, 'page_up': 0x21, 'page_down': 0x22, 'end': 0x23, 'home': 0x24, 'left_arrow': 0x25, 'up_arrow': 0x26, 'right_arrow': 0x27, 'down_arrow': 0x28, 'select': 0x29, 'print': 0x2A, 'execute': 0x2B, 'print_screen': 0x2C, 'ins': 0x2D, 'del': 0x2E, 'help': 0x2F, '0': 0x30, '1': 0x31, '2': 0x32, '3': 0x33, '4': 0x34, '5': 0x35, '6': 0x36, '7': 0x37, '8': 0x38, '9': 0x39, 'a': 0x41, 'b': 0x42, 'c': 0x43, 'd': 0x44, 'e': 0x45, 'f': 0x46, 'g': 0x47, 'h': 0x48, 'i': 0x49, 'j': 0x4A, 'k': 0x4B, 'l': 0x4C, 'm': 0x4D, 'n': 0x4E, 'o': 0x4F, 'p': 0x50, 'q': 0x51, 'r': 0x52, 's': 0x53, 't': 0x54, 'u': 0x55, 'v': 0x56, 'w': 0x57, 'x': 0x58, 'y': 0x59, 'z': 0x5A, 'numpad_0': 0x60, 'numpad_1': 0x61, 'numpad_2': 0x62, 'numpad_3': 0x63, 'numpad_4': 0x64, 'numpad_5': 0x65, 'numpad_6': 0x66, 'numpad_7': 0x67, 'numpad_8': 0x68, 'numpad_9': 0x69, 'multiply_key': 0x6A, 'add_key': 0x6B, 'separator_key': 0x6C, 'subtract_key': 0x6D, 'decimal_key': 0x6E, 'divide_key': 0x6F, 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75, 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B, 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81, 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87, 'num_lock': 0x90, 'scroll_lock': 0x91, 'left_shift': 0xA0, 'right_shift ': 0xA1, 'left_control': 0xA2, 'right_control': 0xA3, 'left_menu': 0xA4, 'right_menu': 0xA5, 'browser_back': 0xA6, 'browser_forward': 0xA7, 'browser_refresh': 0xA8, 'browser_stop': 0xA9, 'browser_search': 0xAA, 'browser_favorites': 0xAB, 'browser_start_and_home': 0xAC, 'volume_mute': 0xAD, 'volume_Down': 0xAE, 'volume_up': 0xAF, 'next_track': 0xB0, 'previous_track': 0xB1, 'stop_media': 0xB2, 'play/pause_media': 0xB3, 'start_mail': 0xB4, 'select_media': 0xB5, 'start_application_1': 0xB6, 'start_application_2': 0xB7, 'attn_key': 0xF6, 'crsel_key': 0xF7, 'exsel_key': 0xF8, 'play_key': 0xFA, 'zoom_key': 0xFB, 'clear_key': 0xFE, '+': 0xBB, ',': 0xBC, '-': 0xBD, '.': 0xBE, '/': 0xBF, '`': 0xC0, ';': 0xBA, '[': 0xDB, '\\': 0xDC, ']': 0xDD, "'": 0xDE, '`': 0xC0 }