• web自动化测试(selenium.webdriver)


    selenium

    在这里插入图片描述
    在这里插入图片描述
    https://www.selenium.dev/
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    https://www.selenium.dev/documentation/en/webdriver/driver_requirements/
    https://npm.taobao.org/mirrors/chromedriver/
    https://chromedriver.storage.googleapis.com/index.html

    在这里插入图片描述

    Selenium IDE用例录制

    在这里插入图片描述
    在这里插入图片描述
    https://github.com/SeleniumHQ/selenium-ide/releases
    以上都无法下载
    看这儿:https://www.likecs.com/show-205155234.html

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    selenium用例编写

    在这里插入图片描述
    小白入门:http://selenium-python.readthedocs.io/

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from time import sleep
    class TestBaidu:
        def setup(self):
            self.driver = webdriver.Chrome()
            self.driver.maximize_window()
            # 隐式等待 类似于异步
            self.driver.implicitly_wait(5)
        def teardown(self):
            # 退出所有标签
            self.driver.quit()
        def test_baidu(self):
            self.driver.get('http://www.baidu.com')
            self.driver.find_element(by=By.ID,value='kw').send_keys('爱玛科技')
            self.driver.find_element(by=By.ID,value='su').click()
            self.driver.find_element(by=By.LINK_TEXT,value='爱玛科技[603529]A股实时行情 - 百度股市通').click()
            sleep(2)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    selenium三种等待方式

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions
    from selenium.webdriver.support.wait import WebDriverWait
    
    
    class Test_wait:
        def setup(self):
            self.driver = webdriver.Chrome()
            self.driver.maximize_window()
            self.driver.get('https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_579fb540a49b4b5fbb41cb802ab375c1')
    
        def test_wait(self):
            self.driver.find_element(by=By.LINK_TEXT, value='京东家电').click()
    
            # 一点要穿一个参数进去 无论有没有使用
            # def wait(x):
            #     return len(self.driver.find_element(by=By.CLASS_NAME, value='lc-imgarea-base__links-item')) >= 4
            # WebDriverWait(self.driver,8).until(wait)
    
            WebDriverWait(self.driver,6).until(expected_conditions.element_to_be_clickable([By.CSS_SELECTOR,'.logo']))
            self.driver.find_element(by=By.LINK_TEXT, value='企业购').click()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    web控件定位与常见操作

    selenium点击与输入
    在这里插入图片描述

    Xpath

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    Css Selector

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    web控件的交互进阶

    在这里插入图片描述
    在这里插入图片描述

    ActionChains

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    import pytest
    from selenium import webdriver
    from selenium.webdriver import ActionChains, Keys
    from selenium.webdriver.common.by import By
    
    from time import sleep
    class TestAction:
        def setup(self):
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(3)
            self.driver.maximize_window()
    
        def teardown(self):
            self.driver.quit()
            print('结束了!')
    
        def test_case_click(self):
            self.driver.get("http://sahitest.com/demo/clicks.htm")
            element_click = self.driver.find_element(by=By.XPATH,value="//input[@value='click me']")
            element_dbl = self.driver.find_element(by=By.XPATH,value="//input[@value='dbl click me']")
            element_rcm = self.driver.find_element(by=By.XPATH,value="//input[@value='right click me']")
            action = ActionChains(self.driver)
            action.click(element_click)
            action.double_click(element_dbl)
            action.context_click(element_rcm)
            action.perform()
            sleep(3)
    
        # @pytest.mark.skip
        def test_case_move(self):
            self.driver.get('http://www.baidu.com')
            ele = self.driver.find_element(by=By.ID,value="s-usersetting-top")
            action = ActionChains(self.driver)
            action.move_to_element(ele).perform()
            sleep(3)
    
        def test_case_dragdrop(self):
            self.driver.get('http://sahitest.com/demo/dragDropMooTools.htm')
            drag_element = self.driver.find_element(by=By.XPATH,value='//*[@id="dragger"]')
            drop_element = self.driver.find_element(by=By.XPATH,value='/html//div[3]')
            drop_element2 = self.driver.find_element(by=By.XPATH, value='/html//div[5]')
            drop_element3 = self.driver.find_element(by=By.XPATH, value='/html//div[2]')
            action = ActionChains(self.driver)
            action.drag_and_drop(drag_element,drop_element).perform()
            action.click_and_hold(drag_element).release(drop_element2).perform()
            action.click_and_hold(drag_element).move_to_element(drop_element3).release().perform()
            sleep(3)
    
        def test_case_keys(self):
            self.driver.get('http://sahitest.com/demo/label.htm')
            ele = self.driver.find_element(by=By.XPATH,value='/html/body/label[1]/input')
            ele.click()
            action = ActionChains(self.driver)
            action.send_keys("Liang")
            action.send_keys(Keys.SPACE).pause(1)
            action.send_keys("XiaoQii").pause(1)
            action.send_keys(Keys.BACKSPACE).perform()
            sleep(3)
    
    
    if __name__ == '__main__':
        pytest.main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    TouchAction

    在这里插入图片描述
    https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_action.html
    在这里插入图片描述

    from selenium import webdriver
    # 现在没有这个TouchActions了
    from selenium.webdriver import TouchActions
    from selenium.webdriver.common.by import By
    
    class touchAction:
        def setup(self):
            option = webdriver.ChromeOptions()
            option.add_experimental_option('w3c', False)
            self.driver = webdriver.Chrome(options=option)
            self.driver.implicitly_wait(3)
            self.driver.maximize_window()
    
        def teardown(self):
            self.driver.quit()
            print('结束了!')
    
        def test_TouchAction(self):
            self.driver.get('http://www.baidu.com')
            kw = self.driver.find_element(by=By.XPATH,value='//*[@id="kw"]')
            su = self.driver.find_element(by=By.XPATH,value='//*[@id="su"]')
            kw.send_keys('TouchAction')
            action = TouchActions(self.driver)
            action.tap(su)
            action.perform()
            action.scroll_from_element(kw,0,10000).perform()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    但是这个呢 已经用不上了

    表单操作

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    网页frame与多窗口处理

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    from selenium_base import Base
    from selenium.webdriver import ActionChains
    from time import sleep
    
    class Test_switch(Base):
        def test_switch(self):
            self.driver.get('http://www.baidu.com')
            self.driver.find_element(by=self.By.XPATH,value='//*[@id="s-top-loginbtn"]').click()
            register_btn = self.driver.find_element(by=self.By.XPATH,value='//*[@id="TANGRAM__PSP_11__regLink"]')
            action = ActionChains(self.driver)
            action.click(register_btn)
            action.perform()
            print(self.driver.current_window_handle,self.driver.window_handles)
            window_handles = self.driver.window_handles
            self.driver.switch_to.window(window_handles[-1])
            print(self.driver.current_window_handle)
            self.driver.find_element(by=self.By.ID,value='TANGRAM__PSP_4__userName').send_keys("LiangAnqi")
            sleep(0.5)
            self.driver.switch_to.window(window_handles[0])
            sleep(5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    frame处理

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable

    from selenium_base import Base
    class Test_Switch(Base):
        def test_switch(self):
            self.driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
            self.driver.switch_to.frame('iframeResult')
            drag = self.driver.find_element(by=self.By.ID,value="draggable")
            drop = self.driver.find_element(by=self.By.ID,value="droppable")
            print(drag.text,drop.text)
            self.driver.switch_to.default_content()
            print(self.driver.find_element(by=self.By.XPATH,value='//*[@id="submitBTN"]').text)
            self.sleep(3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    selenium 多浏览器处理

    在这里插入图片描述
    在这里插入图片描述
    但是呢 要在terminal输入:browser=Chrome pytest selenium_test/switch_to_frame.py -s -v

    执行javascript脚本

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    from selenium_base import Base
    class Test_Js(Base):
        def test_js(self):
            self.driver.get('http://www.baidu.com')
            self.driver.execute_script("document.querySelector('#kw').value='selenium测试'")
            self.driver.execute_script("document.querySelector('#su').click()")
            self.driver.execute_script("document.documentElement.scrollTop=10000")
            self.sleep(2)
            self.driver.execute_script("document.querySelectorAll('.page-inner_2jZi2 a')[8].click()")
            self.sleep(5)
            for code in [
                'return document.title','return JSON.stringify(performance.timing)'
            ]:
                print(self.driver.execute_script(code))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    在这里插入图片描述
    https://www.12306.cn/index/

        def test_12306(self):
            self.driver.get('https://www.12306.cn/index/')
            self.driver.execute_script("a=document.querySelector('#train_date');a.value=''")
            self.sleep(5)
    
    • 1
    • 2
    • 3
    • 4

    文件上传、弹框处理

    在这里插入图片描述
    在这里插入图片描述
    https://image.baidu.com

    from selenium_base import Base
    class Test_Upload(Base):
        def test_upload(self):
            self.driver.get('https://image.baidu.com')
            self.driver.find_element(by=self.By.ID,value='sttb').click()
            self.driver.find_element(by=self.By.ID,value='stfile').send_keys('/Users/lianganqi/Desktop/python/img/baidu.jpg')
            self.sleep(8)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    from selenium_base import Base
    from selenium.webdriver import ActionChains
    class Test_Switch(Base):
        def test_switch(self):
            self.driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
            self.driver.switch_to.frame('iframeResult')
            drag = self.driver.find_element(by=self.By.ID,value="draggable")
            drop = self.driver.find_element(by=self.By.ID,value="droppable")
            action = ActionChains(self.driver)
            action.drag_and_drop(drag,drop).perform()
            self.sleep(2)
            self.driver.switch_to.alert.accept()
            self.driver.switch_to.default_content()
            self.driver.find_element(by=self.By.ID,value='submitBTN').click()
            self.sleep(3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    Page Object设计模式

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 公共方法要替代页面的服务
    • 不要暴露页面的细节
    • 不要在page object中使用断言(assert)
    • 方法返回page object
    • 不需要表示整个页面
    • 同一动作的不同结果被合并为不同的方法
      在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    等待

    在这里插入图片描述

    无界面模式

    不会打开网页,但是一样能获取到数据。
    在这里插入图片描述

  • 相关阅读:
    【Maven】高级应用
    C语言小游戏之三子棋(井字棋)(1.5w字超详细讲解)
    攻防演练过程中防守方必备的关键安全设备
    mysql查询优化
    数据库实验报告(一)
    计算机系统的基本概念
    美食杰项目 -- 发布菜谱(七)
    程序员的数学课16 二分法:如何利用指数爆炸优化程序?
    Day08_DM层建设实战,本地视频+md,review第1遍,220625,
    C语言之指针练习题
  • 原文地址:https://blog.csdn.net/camille009/article/details/126829235