selenium之web控件定位

find_element[python]

在python里面,webdriver提供find_element()/find_elements方法定位元素,前者返回一个元素,后者返回多个元素。其参数为(by,value),by是定位方式,value是对应的值。

find_element源码如下:

    def find_element(self, by=By.ID, value=None):
        if self.w3c:
            if by == By.ID:
                by = By.CSS_SELECTOR
                value = '[id="%s"]' % value
            elif by == By.TAG_NAME:
                by = By.CSS_SELECTOR
            elif by == By.CLASS_NAME:
                by = By.CSS_SELECTOR
                value = ".%s" % value
            elif by == By.NAME:
                by = By.CSS_SELECTOR
                value = '[name="%s"]' % value
        return self.execute(Command.FIND_ELEMENT, {
            'using': by,
            'value': value})['value']

By源码如下:

    class By(object):
        """
        Set of supported locator strategies.
        """

        ID = "id"
        XPATH = "xpath"
        LINK_TEXT = "link text"
        PARTIAL_LINK_TEXT = "partial link text"
        NAME = "name"
        TAG_NAME = "tag name"
        CLASS_NAME = "class name"
        CSS_SELECTOR = "css selector"

8种定位方式

通过python源码,我们可以分析出selenium提供的各种定位方式。
总共有8种定位方式:

方式名称 对应属性 说明
ID id 元素的id属性,一般都是唯一的
NAME name 元素的name属性,一般都是唯一的
XPATH xpath 用页面中元素的路径进行查找,几乎能定位到所有元素,但是查找较慢
TAG_NAME tag name 通过元素的标签名称进行查找,一般会找到多个,结合find_elements使用
CLASS_NAME class name 使用元素的css样式的class name查找
CSS_SELECTOR css selector 通过css样式选择器进行定位,这种定位非常快速
LINK_TEXT link text 通过链接的文本进行定位,文本全匹配查找
PARTIAL_LINK_TEXT partial link text 通过链接的文本进行定位,模糊查找

实例

以百度首页为例:以下是页面源码
搜索输入框:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
百度一下的按钮:
<input type="submit" id="su" value="百度一下" class="bg s_btn">
新闻的链接:
<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>
实例脚本代码:

from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

class TestLocat():
    def setup_class(self):
        self.driver=Chrome()
        self.driver.implicitly_wait(3)

    def setup(self):
        self.driver.get("https://www.baidu.com")

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

    def test_id(self):
        self.driver.find_element(By.ID,"kw").send_keys("百度")
        self.driver.find_element_by_id("su").click()
    def test_name(self):
        self.driver.find_element(By.NAME,"wd").send_keys("百度")
    def test_xpath(self):
        self.driver.find_element(By.XPATH,"//*[@name='wd']").send_keys("百度")
        self.driver.find_element_by_xpath("//*[@id='su']").click()
    def test_tag_name(self):
        # 输入框是input标签,按钮也是,所以这里也会报错
        self.driver.find_element(By.TAG_NAME,"input").send_keys("百度")
    def test_link(self):
        self.driver.find_element(By.LINK_TEXT,"新闻").click()
    def test_plink(self):
        self.driver.find_element_by_partial_link_text("闻").click()
    def test_classname(self):
        # 新闻链接,百度首页左上角的链接文字class name 都是相同的,所以此处会报错
        self.driver.find_element(By.CLASS_NAME,"mnav c-font-normal c-color-t").click()
    def test_cssselector(self):
        self.driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("百度")
        self.driver.find_element_by_css_selector("#su").click()

总结

通过find_element的源码发现:ID/NAME/TAG_NAME/CLASS_NAME都会被替换成CSS_SELECTOR方式实现,因此基本上所有的定位都可以用xpath或css selector方式,只要学好如何使用xpath或css selector定位即可。

[created_at:2020-06-27 updated_at:2020-06-28]
[我的导航目录]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容