zoukankan      html  css  js  c++  java
  • 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
    }
  • 相关阅读:
    ES6之主要知识点(二) 变量的解构赋值。默认值
    ES6之主要知识点(一)
    前后端通信
    js 面向对象类
    typeof 、Object.prototype.toString和 instanceof
    原型链 之 对象的创建
    Ueditor1.4.3.3+springMvc+maven 实现图片上传
    Hibernate 根据实体名称得到DB表名以及表对应的Sequence name
    第三章:对象的共享——java并发编程实战
    第二章:线程安全性——java并发编程实战
  • 原文地址:https://www.cnblogs.com/xiaoxiao075/p/11067674.html
Copyright © 2011-2022 走看看