所谓定位,就是要找到位置。比如生活中常见的GPS定位,就是要找到目标位置所在的经纬度
那我们这里所说的定位,是要找到一个元素在网页上的位置。因为selenium可以驱动浏览器,通过定位规则找到目标对象的位置,从而来操作这个元素。比方说 我们现在要对这个输入框写入一个test,来测试输入框的功能,那必然要找到这个网页上输入框位置在哪里,然后再写入。
这里我们整理一些常用的定位方式
以百度首页为例
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
方式一:通过ID来定位,ID是不会变的,就比如我们要找这条街上的***,那他的身份证就是一个唯一的ID,找到这个ID就好了
driver.find_element_by_id('kw')
方式二:通过name来定位,name可能会重名,比如要找某某村的小红,可能这个村里叫小红的就有3个呢,
如果我只需要找一个叫小红的,写法:
driver.find_element_by_name('wd')
如果我要把这些叫小红的都找出来,写法:
driver.find_elements_by_name('wd')
方式三:通过tag_name来定位,tag_name也可能会重名,因为一个标签可能会搜索出好几个。比如现在要找某某村的所有小孩,这个小孩就是一个标签。这样形容
似乎不是很合理。那我们一个html网页,无非就是输入框,按钮,链接,这些都有特定的标签来标识,这个时候我们用标签来定位
driver.find_element_by_tag_name('input')
方式四:通过class属性来定位。类名,class是用来装饰的,是样式
driver.find_element_by_class_name('s_ipt')
方式五:链接文本匹配
driver.find_element_by_link_text('新闻')
匹配部分文本,写法如下:
driver.find_element_by_partial_link_text('产品')
方式六:xpath定位,实际使用过程中基本都是用这种方式来定位。//开头 标签[@属性=属性值] 属性组组合,如//input[@id='kw']
写法:
driver.find_element_by_xpath('//input[@id="kw"]')
如果一个属性值定位不到,也可以用多个属性用and连接
driver.find_element_by_xpath('//input[@id="kw" and @class="s_ipt"]')
一般我们是用到上面这种相对定位的方式,绝对定位的方式一般不会用,绝对定位就是从根节点开始找,这样如果网页稍微有变化,就找不到了。
A通过文本内容来定位text()
写法://input[@id="su" and text()="百度一下"]或者//input[text()="百度一下"] 这种一般使用在定位菜单啊 这些文本内容不会变化的元素
B通过contains()函数来定位,比如当文本内容很多时,我们可以用contains(text(),"上学啦")部分匹配文本
也可以部分匹配某个属性值,比如contains(@class,"bg"),表示匹配class属性的部分值来查找元素
以上图为例,//input[contains(@class,"bg")]--小心机,当我们看到class的值有空格分开的时候,表示是多个class
//input[contains(text(),"百度")]