链式调用

方法链接是一种技术,用于对同一个对象进行多个方法调用,只使用一次对象引用。

基本例子

先来看一下如何通过seldom使用链式调用编写Web测试用例。

import seldom
from seldom import Steps


class BaiduTest(seldom.TestCase):

    def test_search_one(self):
        """
        百度搜索
        """
        Steps(desc="百度搜索").open("http://www.baidu.com").find("#kw").type("seldom").find("#su").click()
        self.assertInTitle("seldom")

    def test_search_two(self):
        """
        百度搜索
        """
        s = Steps(desc="百度搜索")
        s.open("http://www.baidu.com")
        s.find("#kw").type("seldom").enter()
        self.assertInTitle("seldom")


if __name__ == '__main__':
    seldom.main(browser="gc", tester="虫师")

用例像链条一样将整个测试过程串联起来,当然,如果你讨厌换行符\,也可以将用例分成多次调用,总之,只要你愿意,可以将所有步骤都串联起来。

import seldom
from seldom import Steps


class BaiduTest(seldom.TestCase):

    def test_search_setting(self):
        """百度搜索设置"""
        Steps(url="http://www.baidu.com", desc="百度搜索设置")
            .open()
            .find("#s-usersetting-top").click()
            .find("#s-user-setting-menu > div > a.setpref").click().sleep(2)
            .find('[data-tabid="advanced"]').click().sleep(2)
            .find("#q5_1").click().sleep(2)
            .find('[data-tabid="general"]').click().sleep(2)
            .find_text("保存设置").click()
            .alert().accept()


if __name__ == '__main__':
    seldom.main(browser="gc", tester="虫师")

Steps 类

Steps 类所提供的API 大部分和Webidrver 类保持一致,但考虑掉到链式的特点,命名上更体现动作

查找元素

from seldom import Steps

c = Steps()
c.find("#id")
c.find(".class")
c.find("[name=password]")
c.find("div > tr > td")
c.find("div", 1)
c.find("text=hao123")
c.find("text*=hao1")

c.find_text("新闻")
  • find(): 只支持CSS定位,这几乎是最强大的定位方法了。 新的测试库cypressplaywright 默认也都是CSS定位。

    • text= 用来定位文本,相当于find_text()
    • test*= 用例模糊定位文本。
  • find_text(): 用于定位文本。

操作方法

import seldom
from seldom import Steps


class TestCase(seldom.TestCase):

    def test_chaining_api(self):
        Steps(desc="chaining api")
            .open("https://www.baidu.com")
            .max_window()
            .set_window(800, 600)
            .find("css").clear()
            .find("css").type("seldom")
            .find("css").enter()
            .find("css").submit()
            .find("css").click()
            .find("css").double_click()
            .find("css").move_to_click()
            .find("css").click_and_hold()
            .find("css").switch_to_frame()
            .find("css").select(value="")
            .find("css").select(text="每页显示20条")
            .find("css").select(index=2)
            .switch_to_frame_out()
            .switch_to_window(1)
            .refresh()
            .alert().accept()
            .alert().dismiss()
            .screenshots()
            .element_screenshot()
            .sleep(1)
            .close()
            .quit()

  1. 基于元素定位的操作先调用find()/find_text(), 例如type(), click() 等。

  2. accept()/dismiss() 是基于alert的操作。

控制浏览器启动和关闭

seldom 默认通过seldom.main(browser="edge")全局设置浏览器的启动和关闭,一般我们不需要关心浏览器的启动和关闭。

seldom 3.9.0 支持手动控制浏览器的驱动和关闭。

  • 每个用例启动和关闭浏览器。
import seldom
from seldom import Steps


class WebTestChaining(seldom.TestCase):
    """test chaining API"""

    def start(self):
        self.step = Steps(browser="edge")

    def end(self):
        self.step.quit()

    def test_baidu(self):
        """test baidu search"""
        self.step.open("https://www.baidu.com").find("#kw").type("seldom").find("#su").click().sleep(2)
        self.assertInTitle("seldom")

    def test_bing(self):
        """test bing search"""
        self.step.open("https://www.bing.com").find("#sb_form_q").type("seldomqa").submit().sleep(2)
        self.assertInTitle("seldomqa")


if __name__ == '__main__':
    seldom.main()