3. Find
乙醇 创建于 about 7 years 之前
最后更新: less than a minute 之前
阅读数: 175
webium.find.Find
方法可以在页面或者其他容器中定位元素,返回WebElement
实例。
Find方法的主要用到2个参数分别是
by
: 定位策略,比如By.IDvalue
: 定位元素时用到的具体属性值
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方法就是这么设计以便正常工作的。