1、selenium介绍

主要由webdriver、IDE、grid

2、selenium环境配置

(1)准备Python环境

(2)准备selenium环境

(3)下载浏览器对应driver版本

CNPM Binaries Mirror

(4)driver的环境变量配置

(5)在Python中import对应的依赖

3、selenium IDE

录制脚本


IDE使用如图

python selenium执行的vue文件 python selenium ide_python

4、selenium简单测试用例

from selenium import webdriver
from time import sleep


class TestHogwards():
    def setup(self):
        self.driver = webdriver.Chrome(executable_path='./chromedriver')
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)  # 隐式等待

    def teardown(self):
        sleep(3)
        self.driver.quit()

    def test_hogwards(self):
        self.driver.get("https://testerhome.com/")

        self.driver.find_element_by_link_text("社团").click()
        self.driver.find_element_by_xpath('//*[@id="hot_teams"]/div[2]/div/div[1]/div/div[2]/div[1]/a').click()
        self.driver.find_element_by_xpath('//*[@id="main"]/div/div[1]/div/div[1]/div[1]/div[2]/div[1]').click()

5、selenium的等待方式

(1)直接等待

强制等待,线程休眠一定的时间

import time

time.sleep(3)

(2)隐式等待

设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,等待时间结束没有发现元素就抛出异常,作用于全局

self.driver.implicitly_wait(3)

(3)显示等待

在代码中定义等待条件,当条件发生时才继续执行代码

WebDriverWait配合until()  until_not()  方法,根据判断条件进行等待

程序每隔一段时间(默认0.5秒)进行条件判断,如果条件成立,则执行下一步,否则继续等待直到超过设置的最大等待时间

举例一:

from time import sleep

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait


class TestWait:
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(3)

    def teardown(self):
        self.driver.quit()

    def test_wait1(self):
        self.driver.get("https://testerhome.com/")

        def wait_(x):  # 一定要具有参数,否则报错
            a = len(self.driver.find_elements_by_xpath('//*[@id="main-nav-menu"]/li'))
            if a >= 1:
                print(a)
                return a

        WebDriverWait(self.driver, 10).until(wait_) #
        self.driver.find_element_by_xpath('//*[@id="main-nav-menu"]/li[1]/a').click()

        print("hello")

举例二:

from time import sleep

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 TestWait:
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(3)

    def teardown(self):
        self.driver.quit()

    def test_wait1(self):
        self.driver.get("https://testerhome.com/")
        WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(
            (By.XPATH, '//*[@id="main-nav-menu"]/li')
        ))
        # 逻辑是 当页面根据xpath找到节点,并且节点可点击,显示等待10秒
        self.driver.find_element_by_xpath('//*[@id="main-nav-menu"]/li[1]/a').click()
        print("hello")

6、selenium点击与输入

find_element(BY.ID,'kw').send_keys('pytest')

find_element(BY.ID,'su').click()

7、xpath定位

XML Path Language

用于解析HTML与XML

用于:selenium、appnium

特点:定位慢,但是是万能定位方法

举例:

/bookstore/book[1]
 选取属于 bookstore子元素的第一个book元素。
 /bookstore/book[last()]
 选取属于 bookstore子元素的最后一个book元素。
 /bookstore/book[last()-1]
 选取属于 bookstore子元素的倒数第二个book元素。
 /bookstore/book[position()<3]
 选取最前面的两个属于 bookstore元素的子元素的book元素。
 //title[@lang='eng'l
 选取所有 title元素,且这些元素拥有值为eng的lang属性。
 /bookstore/book[price>35.00]
 选取 bookstore元素的所有book元素,且其中的 price元素的值须大于35.00 
pookstore/book[price>35.00]/title
 选取 bookstore元素中的book元素的所有 title素,且其中的 price元素的值须大于35.00

 nodename           选取此节点的所有子节点。
/                            从根节点选取。  定位子元素
//                         从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。定位子孙元素
.                           选取当前节点。
..                          选取当前节点的父节点。
 @                          选取属性。
tips:
/   只能定位子元素一层
//  定位到所有的下级元素

百度网页练习定位:

python selenium执行的vue文件 python selenium ide_软件测试_02

f12后在 console查找

(1)$x('//*[@id="s_tab"]//b')

定位到“网页”

(2)$x('//*[@id="s_tab"]//a[1]')

定位到“资讯”

(3)$x('//*[@id="s_tab"]//a[last()-1]')

定位倒数第二个元素

(4)$x('//*[@name="wd"]')

(5)$x('//*[@id="kw"]')

(6)$x('//*[@id="u"]/a[1]')

8、driver常用定位

id

name

link_text

partial_link_text

class_name

tag_name

9、css selector定位

appium不支持原生的css,

比xpath定位快

选择器例子描述.class.intro选择class=‘intro’的所有元素#id#firstname选择id=‘firstname’的所有元素**选择所有元素elementp选择所有<p>元素element,elementdiv,p选择所有<div>元素和<p>元素element elementdiv p选择<div>元素内部的所有的<p>元素element>elementdiv>p选择父元素为<div>元素的所有<p>元素element+elementdiv+p选择紧接着<div>元素之后的所有<p>元素

[attribute]                [target]        选择带有target属性的所有元素

[attribute=value]        [tartget=_blank]        选择target=“_blank”的所有属性

:nth-child(n)        p:nth-child(2)                选择属于其父元素的第二个子元素的每个<p>元素

element1~element2        p~ul                选择前面有<p>元素的每个<ul>元素

举例:

(1)$('[id=kw]')

(2)$('[name=wd]')

(3)$('#s_tab b')

(4)$('#s_tab a:nth-child(2)')

(5)$('#s_tab a:nth-last-child(1)')

10、web控件交互与操作

ActionChains:执行PC端的鼠标点击、双击、右键、拖拽等事件

TouchChains:模拟PC端和移动端的点击、滑动、拖拽、多点触控等手势操作

11、ActionChains 动作链接

调用actionchains的方法时,不会立即执行,而是将所有操作按顺序加入队列中,调用perform()方法时,队列事件依次执行

基本用法

  • 生成一个动作 action=ActionChains(driver)
  • 动作添加 action.方法1
  • 动作添加 action.方法2
  • 调用perform()执行 action.perform()

语法

(1)链式:

ActionChains(driver).move_to_element(element).click(element).perform()

(2)分布:

actions=ActionChains(driver)

actions.move_to_element(element)

actions.click(element)

actions.perform()

模拟按键

action=ActionChains(driver)

action.send_keys(keys.BACK_SPACE)

action.key_down(keys.CONTROL).send_keys('a').key_up(keys.CONTROL)

action.perform()

代码示例

from time import sleep

import pytest
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys


class TestActionChains:
    def setup(self):
        self.driver = webdriver.Chrome(executable_path='./chromedriver')

        self.driver.maximize_window()
        self.driver.implicitly_wait(3)

    def teardown(self):
        self.driver.quit()

    # @pytest.mark.skip
    def test_click(self):
        # 点击事件
        self.driver.get("https://sahitest.com/demo/clicks.htm")
        e_click = self.driver.find_element_by_xpath('/html/body/form/input[3]')
        e_doubleclick = self.driver.find_element_by_xpath('/html/body/form/input[2]')
        e_rightclick = self.driver.find_element_by_xpath('/html/body/form/input[4]')
        # 创建action对象
        actions = ActionChains(self.driver)
        # 添加点击事件
        actions.click(e_click)
        # 添加双击事件
        actions.double_click(e_doubleclick)
        # 添加右键点击事件
        actions.context_click(e_rightclick)
        # 执行已添加的事件
        actions.perform()

    # @pytest.mark.skip
    def test_move_to_element(self):
        self.driver.get("https://www.baidu.com/")
        e_move = self.driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
        actions = ActionChains(self.driver)
        # 鼠标光标移动到某个元素上
        actions.move_to_element(e_move)
        actions.perform()
        sleep(2)

    # @pytest.mark.skip
    def test_drag_drop(self):
        self.driver.get("https://sahitest.com/demo/dragDropMooTools.htm")
        e_drag = self.driver.find_element_by_xpath('//*[@id="dragger"]')
        e_drop = self.driver.find_element_by_xpath('/html/body/div[2]')
        actions = ActionChains(self.driver)
        # 将A元素拖拽到B元素上
        actions.drag_and_drop(e_drag, e_drop)
        # actions.click_and_hold(e_drag).release(e_drop).perform()  等同于拖拽操作
        # actions.click_and_hold(e_drag).move_to_element(e_drop).release().perform()  同上
        actions.perform()
        sleep(2)

    def test_keys(self):
        self.driver.get('https://sahitest.com/demo/label.htm')
        e_keys = self.driver.find_element_by_xpath('/html/body/label[1]/input')
        e_keys.click()
        actions = ActionChains(self.driver)
        # pause 暂停1秒看操作
        actions.send_keys('username1').pause(1)
        actions.send_keys(Keys.SPACE).pause(1)  # 键盘上的空格
        actions.send_keys('tom').pause(1)
        actions.send_keys(Keys.BACK_SPACE).pause(1)  # 键盘上的退格操作
        actions.perform()
        sleep(2)


if __name__ == '__main__':
    pytest.main(['-v', '-s', 'test_actionchains.py'])

12、TouchAction

ActionChains 无法操作H5页面

TouchAction 可以对H5页面进行操作,可实现点击、滑动、拖拽、多点触控以及模拟手势操作

手势控制

tap   指定元素上敲击

doyble_tap   指定元素双敲击

tap_and_hold     指定元素点击且不释放

move           手势移动指定偏移 (未释放)

release         释放手势

scroll            手势点击并滚动

scroll_from_element         从某个元素位置开始手势点击并滚动(向下为负,向上为正)

long_press     长按元素

flick  手势滑动

flick_element    从某个元素位置手势开始滑动(向上为负,向下为正)

perform 执行

代码示例

 

import time

from selenium import webdriver
from selenium.webdriver import TouchActions


class TestTouchAction():
    def setup(self):
        option=webdriver.ChromeOptions()
        option.add_experimental_option('w3c',False)
        self.driver = webdriver.Chrome(executable_path='./chromedriver',options=option)

        self.driver.maximize_window()
        self.driver.implicitly_wait(3)

    def teardown(self):
        self.driver.quit()

    def test_touchaction_scrollbottom(self):
        self.driver.get("https://www.baidu.com/")
        el= self.driver.find_element_by_id("kw")
        el_search = self.driver.find_element_by_id("su")
        el.send_keys("selenium")
        action=TouchActions(self.driver)
        #添加 单击搜索按钮事件
        action.tap(el_search)
        action.perform()
        #以某个元素为起点,x轴(左右)滑动0像素,y轴(上下)滑动10000像素
        action.scroll_from_element(el,0,10000).perform()
        time.sleep(2)

13、表单操作

什么是表单?

  • 表单是包含表单元素的区域
  • 表单元素允许用户在表单中输入信息的元素
  • 表单使用表单标签定义  <form><input/></form>

操作表单元素步骤:

  • 首先定位表单元素
  • 然后操作具体元素的输入、清空、点击等操作


from time import sleep

from selenium import webdriver


class TestForm:
    def setup(self):
        # option = webdriver.ChromeOptions()
        # option.add_experimental_option('w3c', False)
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)

    def teardown(self):
        self.driver.quit()

    def test_sign_in(self):
        self.driver.get("https://testerhome.com/account/sign_in")
        self.driver.find_element_by_xpath('//*[@id="user_login"]').send_keys('demaxiya')
        self.driver.find_element_by_xpath('//*[@id="user_password"]').send_keys('123456')
        self.driver.find_element_by_xpath('//*[@id="new_user"]/div[3]/div/label').click()
        self.driver.find_element_by_xpath('//*[@id="new_user"]/div[4]/input').click()
        sleep(2)