代码改变世界

Python+Selenium学习笔记6 - 定位

2018-05-15 21:44  起个昵称  阅读(312)  评论(0编辑  收藏  举报

1.8种针对个元素的定位方法

find_element_by_id()

find_element_by_name()

find_element_by_class_name()

find_element_by_tag_name()

find_element_by_link_text()

find_element_by_partial_link_text()

find_element_by_xpath()

find_element_by_css_selector()

 

2..8种针对个元素的定位方法

find_elements_by_id()

find_elements_by_name()

find_elements_by_class_name()

find_elements_by_tag_name()

find_elements_by_link_text()

find_elements_by_partial_link_text()

find_elements_by_xpath()

find_elements_by_css_selector()

 

3.可能出现的问题

若查找的元素不止一个,但只用了find_element_...方法时,会出现如下提示。是因为漏掉elements

TypeError: 'FirefoxWebElement' object is not iterable

 

注意

刚开始时用上面的方法定位经常定位不到,后来发现了以下原因

1.没有留意页面元素有无用frame/iframe表单。若有,需要用switch_to.frame()先定位到frame/iframe表单的内嵌页面中,再用find_element_by...定位。

   若下一个定位元素不在这个表单了,则需要用switch_to.parent_content()跳出当前一级表单,或用switch_to.default_content()跳回最外层的页面。

2.用find_element_by_xpath()定位时,直接用Firefox浏览器的页面元素用右键复制xpath时是这个格式"/html/body/div[2]/div[2]/div/div[1]/div[1]/div[1]/a[3]"。 Python有时候能定位到,但大多数时候是定位不了的,这时候就要修改一下这个path了。先从右往左逐级查找有唯一的且可用的属性值。如下图为例:path是/html/body/div[2]/div[2]/div/div[1]/div[1]/div[1]/a[3]  最底下一层<a class="toptitle"...>有三个,所以不能直接用这个属性,再看它的父对象<div class="right">,往上查找只有这里用到,

所以xpath可改为 //*[@class='right']/a[3]。又有一种情况class='right'有两个,而我要用的元素还有一个属性id='red',那就可以这么写//*[@class='right' and @id='red' ]/a[3]

 

 靠着上面两点,目前为止都能定位到页面元素了。