• 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
    • 不需要表示整个页面
    • 同一动作的不同结果被合并为不同的方法
      在这里插入图片描述

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

    等待

    在这里插入图片描述

    无界面模式

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

  • 相关阅读:
    Android studio:打开应用程序闪退的问题
    Spring Boot中Jack相关问题(精度丢失/日期格式化/忽略null值)
    Redis 和 Memcache 的区别
    工作上的三个境界:能做,能做好,能持续做好
    token、cookie、session的对比以及Java实现
    青少年软件编程(Python语言)等级考试试卷目录一览
    linux vscode git 相关记录
    React 函数式组件性能优化指南
    2023-10-16 itoa函数的局限以及实现
    Java 22正式发布,一文了解全部新特性
  • 原文地址:https://blog.csdn.net/camille009/article/details/126829235