# 3. Find




```webium.find.Find``` 方法可以在页面或者其他容器中定位元素，返回```WebElement```实例。

Find方法的主要用到2个参数分别是

* ```by```: 定位策略，比如By.ID
* ```value```: 定位元素时用到的具体属性值

```python
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```的行为。

```python
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，那么你应该直接把该页面对象直接传到定位代码里。

```python
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方法就是这么设计以便正常工作的。





原始封面

![课程图片](https://images.unsplash.com/photo-1496171367470-9ed9a91ea931?w=300)


