3. Find

乙醇 创建于 2 年多 之前

最后更新时间 2018-11-26

webium.find.Find 方法可以在页面或者其他容器中定位元素,返回WebElement实例。

Find方法的主要用到2个参数分别是

  • by: 定位策略,比如By.ID
  • value: 定位元素时用到的具体属性值
from selenium.webdriver.common.by import By
from webium import BasePage, Find

class SomePage(BasePage):
    buy_btn = Find(by=By.CSS_SELECTOR, value='a.buy-btn')

    def __init__(self):
        super(SomePage, self).__init__(url='http://itest.info')


if __name__ == '__main__':
    page = SomePage()
    page.open()
    page.buy_btn.click()

ui_type

在定位一些自定义的对象时我们可以指定ui_type参数来定制化Find的行为。

from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
from webium import BasePage, Find

class Link(WebElement):
    def is_secure(self):
        return self.get_attribute('href').startswith('https://')


class TypedPage(BasePage):
    join_link = Find(Link, By.CSS_SELECTOR, 'a.hover-effect')

    def __init__(self):
        super(TypedPage, self).__init__(url='http://itest.info')


if __name__ == '__main__':
    page = TypedPage()
    page.open()
    print('Is link secure: ' + str(page.join_link.is_secure()))

上面的例子里,我们定义了Link类,继承自WebElement,用以代表一般性的链接。is_secure()方法用来判断链接是否是https协议的。

join_link = Find(Link, By.CSS_SELECTOR, 'a.hover-effect')表示定位元素,并返回类型是Link的实例。

context 上下文

有时候你可能在用例运行时才可以确定页面的结构,现代网页是动态且多变的。如果你不能在类属性的定义中使用Find,那么你应该直接把该页面对象直接传到定位代码里。

from selenium.webdriver.common.by import By
from webium import BasePage, Find

class DynamicPage(BasePage):
    def __init__(self):
        super(DynamicPage, self).__init__(url='http://itest.info')

    def get_link_by_href(self, href):
        return Find(by=By.CSS_SELECTOR, value='a[href*="{0}"]'.format(href), context=self)


if __name__ == '__main__':
    page = DynamicPage()
    page.open()
    page.get_link_by_href('registration').click()

上面的例子里, get_link_by_href(self, href)方法通过动态传入的href来定为不同的对象,这时候就需要把self传入Find的对应上下文里,这是套路,因为Find方法就是这么设计以便正常工作的。

上一篇: 2. BasePage下一篇: 4. Finds

我要留言

暂无评论