selenium八大定位

1、id定位

HTML tag的值是唯一的,不可能一个id定位多个元素的情况,找到元素的id值就可以控制这个元素

find_element_by_id  这个方法就是通过id来定位

环境要安装Chrome浏览器驱动Chromedriver.exe,并把驱动文件放在Chrome目录下,设置环境变量Path,才可以把Chrome对象赋值给变量。

通过下图可以看到百度搜索框的id是"kw"

运行效果:

 

2、name定位

HTML规定name来指定元素的名称,find_element_by_name  这个方法就是通过name定位

 注意:用name定位方式时要注意name值是否唯一,否则定位失败

 

3、class定位

HTML规定class来指定元素的类名,find_element_by_class_name 这是class定位的方法 

找到class的值s_ipt,代码同上

 

4、link_text定位

link_text是以超链接全部名字作为关键字来定位元素的,以百度首页"新闻"超链接为例,关键字是新闻

find_element_by_link_text方法通过元素标签对之间的文本信息来定位元素,运行代码

 注意:用这个方法来定位元素超链接,中文字需要写全

 

5、partial_link_text 定位

partial link 定位时对link定位的一种补充,有些文本链接比较长,这时候我们取文件链接的一部分来定位,只要这一部分信息可以唯一标识这个链接

find_element_by_partial_link_text(),内容可以写部分文本链接信息即可

 例如hao123,使用方法时输入123也可以定位到这个元素,代码如下:

 执行代码,会打开hao123

 

6、tag name定位

HTML的本质就是通过tag来定义实现不同的功能,每一个元素本质上也是一个tag,因为一个tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。

find_element_by_tag_name()方法通过元素的tag name来定位元素

 

7、XPath定位

通过xpath来定位元素的方式,对比较难以定位的元素来说很有效,几乎都可以解决,特别是对于有些元素没有id和name等属性的情况。

XPath是xml Path语言的缩写,是一种用来确定xml文档中某部分位置的语言,它可以在xml文档中·通过元素名和属性进行搜索,主要用途是在xml文档中寻找节点,Xpath定位比css定位有更大的灵活性,Xpath可以向前搜索也可以向后搜索,而css定位只能向前搜索,但是Xpath定位速度要比css慢一些

1)绝对路径定位

XPath有多种定位策略,最简单直观的就是写出元素的绝对路径,

 find_element_by_xpath(".....")方法使用Xpath语言来定位元素,Xpath主要用标签名的层级关系来定位元素的绝对路径,最外层为HTML语言。在body文本内,一级一级往下查找,如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个,例如div【2】表示当前层级下的第二个div标签

 

 快速获取路径位置,使用copy full xpath直接复制粘贴即可

2)利用元素属性定位

//表示当前页面某个目录下,input表示定位元素的标签名,[@id="kw"]表示这个元素的id属性值等于kw

 

 如果不想指定标签名也可以用*代替,元素的任意一个属性值都可以使用,只要它是唯一的标识一个元素即可

3)层级与属性结合

如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以找其上一级的父元素,如果上一级元素有可以唯一标识属性的值吗,那么可以拿来使用

find_element_by_xpath("//标签名[@属性=‘属性值’] /想要定位的标签名"),如果子节点下没有那么可以继续往下延伸,直到找到为止

find_element_by_xpath("//标签名[@属性=‘属性值’]/.../想要定位的标签名]")

4)使用逻辑运算符

如果一个属性不能唯一区分一个元素,那么使用逻辑运算符可以同时连接多个条件,同时使用多个属性去唯一的标识这个元素

find_element_by_xpath("//标签名[@属性=‘属性值’ and @属性=‘属性值‘ and ...]")

find_element_by_xpath("//标签名[@属性=‘属性值’ and @属性=‘属性值‘ and ...] /.../标签名]"),多个条件加层级去定位

 

8、css定位

CSS是一种语言,用来描述HTML和xml文档的表现,可以较为灵活地选择控件的任意属性,一般情况下定位速度要比Xpath快

1)通过class属性来定位元素

find_element_by_css_selector(".") 方法用于CSS语言定位元素,点号(.)表示通过class属性来定位元素

2)通过id属性定位

find_element_by_css_selector("#") 方法用于CSS语言定位元素,#号表示通过id属性来定位元素

3)通过标签名定位元素

find_element_by_css_selector("标签名")

find_element_by_css_selector("父标签名>子标签名"),查找它的所有标签叫子标签名的子元素

4)通过属性定位

find_element_by_css_selector("[属性=属性值]")

可以通过元素的任意属性去定位,只要这些属性可以唯一标识这个元素,对于属性值来说,可加引号,也可以不加,但注意和整个字符串的引号进行区分

5)组合定位

find_element_by_css_selector("标签名[属性=属性值]"),可以标签名加属性组合的方式来定位元素

find_element_by_css_selector("标签名.class属性值 or #id属性值"),组合定位属性

find_element_by_css_selector("父标签>子标签>子标签.class属性值"),这是标签名层级加class定位元素

find_element_by_css_selector("父标签#id属性值>子标签>子标签#id属性值"),这是标签层级加name定位元素

试想也可以用.class属性值+ #id属性值,加层级去唯一标识这个元素。

 

9、定位iframe
1.有id,并且唯一,直接写id
driver.switch_to_frame("x-URS-iframe")
driver.switch_to.frame("x-URS-iframe")

2.有name,并且唯一,直接写name
driver.switch_to_frame("xxxx")
driver.switch_to.frame("xxxx")

3.无id,无name,先定位iframe元素
iframe = driver.find_elements_by_tag_name("iframe")[0]
driver.switch_to_frame(iframe)
driver.switch_to.frame(iframe)

4.通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:

  • index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位
  • WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象

举个例子:

<iframe src="myframetest.html" />
  • 1

用xpath定位,传入WebElement对象:

driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'myframe')]"))


5.从frame中切回主文档(switch_to.default_content())

切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。

driver.switch_to.default_content()
  • 1
posted @ 2020-03-18 17:15  自由人皮卡卡  阅读(331)  评论(0)    收藏  举报