Python-Selenium 网页元素定位方式

webdriver 提供了八种元素定位方法:

·id

·name

·class name

·tag name

·link text

·partial link text

·xpath

·css selector

在 Python 语言中对应的定位方法如下:

1- id定位

通过页面元素的id属性进行元素的定位。

find_element_by_id()方法返回与ID属性值匹配的一个元素。

find_elements_by_id()方法返回一组元素。

driver.find_element_by_id("su")

driver.find_elements_by_id("su")

2- name定位

通过页面元素的name属性进行元素的定位。如果name值匹配成功可返回定位的元素;反之,则抛出NoSuchElementException的异常

常用方法:

find_element_by_name() 和find_elements_by_name()方法可以通过匹配name值来定位单个或一组元素。

driver.find_element_by_name("q")

driver.find_elements_by_names("q")

3- class定位

通过页面元素的class属性进行元素的定位。如果name值匹配成功可返回定位的元素;反之,则抛出NoSuchElementException的异常

常用方法:

find_element_by_class_name()和find_elements_by_class_name()方法可以通过匹配class属性来定位单个或一组元素

#查找元素的class属性为button的元素

driver.find_element_by_class_name("button")

driver.find_elements_by_class_name("button")

4- tag定位

通过页面元素的tag名称进行元素的定位。如果tag name匹配成功可返回定位的元素;反之,则抛出NoSuchElementException的异常

常用方法:

find_element_by_tag_name()和find_elements_by_tag_name()方法可以通过匹配tag名称来定位单个或一组元素

#查找元素的class属性为button的元素

find_element_by_class_name("img")

find_elements_by_class_name("qbutton")

5- link 定位

通过文本链接来定位元素,常用的方法有:find_element_by_link_text() 和find_elements_by_link_text()

find_element_by_link_text("地图")

6- partial link 定位

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

find_element_by_partial_link_text(“一个很长的文本链接”)

7- XPath 定位

XPath是一种在XML文档中搜索和定位元素的查询语言。几乎所有的浏览器都支持XPath。同样,Selenium也可以通过XPath的方式在Web页面上定位元素。当我们发现通过ID、 name或class属性值都无法定位元素时,不妨尝试用XPath的方式。我们可以灵活地运用绝对或相对路径定位,也可以通过除ID、 name以外的其他属性来定位,甚至还可以通过属性值的一部分(如starts-with()、 contains()和ends-with())来帮助我们定位。

绝对路径定位/相对路径定位

XPath 的绝对路径主要用标签名的层级关系来定位元素的绝对路径。最外层为 html 语言,body 文本内,一级一级往下查找,如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个,div[2]表示第二个 div 标签。

相对路径,以‘//’开头,格式为xxx.find_element_by_xpath("//标签")

例如:

find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")

find_element_by_xpath("//div[x]/form[x]/input[x]")

#[x]可以省略的,x代表第x个div标签

利用元素属性定位

XPath 也可以使用使素的属性值来定位。我们以百度输入框和搜索按钮为例:

样例

find_element_by_xpath("//input[@id='kw']")

find_element_by_xpath("//input[@id='su']")

find_element_by_xpath("//*[@class='s_ipt']")

表达式 中 //表示当前页面某个目录下,input为标签,该标签的id属性值为’su’。如果不想指定标签名也可以用星号(*)代替。

层级与属性结合:

如果一个元素本身并没有可以唯一标识这个元素的属性值,我们可以找其上一级元素,如果它的上级有可以唯一标识属性的值,也可以拿来使用。

find_element_by_xpath("//span[@class='bg s_btn_wr']/input")

使用逻辑运算符

如果一个属性不能唯一的区分一个元素,我们还可以使用逻辑运算符连接多个属性来区别于其它属性。比如用 and 连接更多的属性来唯一的标识一个元素

find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")

文本值或者属性值使用模糊方法定位

如果标签中间存在唯一的文本值,使用:

find_element_by_xpath("//标签[contains(text(),‘文本值’)]")

如果属性值获取文本值很长,可以使用starts-with()和ends-with()和contains()

find_element_by_xpath("//input[starts-with(@id,'ctrl')]")

find_element_by_xpath("//input[ends-with(@id,'_userName')]")

find_element_by_xpath("//input[contains(@id,'userName')]")

8- CSS选择器定位

CSS(层叠样式表)是一种用于页面设计(HTML)与表现的文件样式,是一种计算机语言,能灵活地为页面提供各种样式风格。 CSS使用选择器为页面元素绑定属性(如ID、 class、 type、 attribute、 value等)

CSS 选择器的常见语法:

CSS选择器常见语法

通过 class 属性定位:

find_element_by_css_selector(".s_ipt")

find_element_by_css_selector(".bg s_btn")

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

通过 id 属性定位:

井号(#)表示通过 id 属性来定位元素。

find_element_by_css_selector("#kw")

find_element_by_css_selector("#su")

通过标签名定位:

在 CSS 语言中用标签名定位元素不需要任何符号标识,直接使用标签名即可,但我们前面已经了解到标签名重复的概率非常大,所以通过这种方式很难唯一的标识一个元素。

find_element_by_css_selector("input")

通过父子关系定位:

上面的写法表示有父亲元素,它的标签名叫 span,查找它的所有标签名叫 input 的子元素。

find_element_by_css_selector("span>input")

通过属性定位:

在 CSS 当中也可以使用元素的任意属性,只要这些属性可以唯一的标识这个元素。

find_element_by_css_selector("input[autocomplete='off']")

find_element_by_css_selector("input[maxlength='100']")

find_element_by_css_selector("input[type='submit']")

组合定位:

我们当然可以把上面的定位策略组合起来使用,这样就大大加强了元素的唯一性。

find_element_by_css_selector("span.bg s_ipt_wr>input.s_ipt")

find_element_by_css_selector("span.bg s_btn_wr>input#su")

9- 用 By 定位元素

有时需要使用定位方法,在具体通过哪种定位方式(id 或 name)根据实际场景而定位,By 就可以设置定位策略。find_element()方法只用于定位元素。它需要两个参数,第一个参数是定位方式,这个由 By 提供;第二个参数是定位的值。在使用 By 时需要将 By 类导入。

from selenium.webdriver.common.by import By

find_element(By.ID,"kw")

find_element(By.NAME,"wd")

find_element(By.CLASS_NAME,"s_ipt")

find_element(By.TAG_NAME,"input")

find_element(By.LINK_TEXT,u"新闻")

find_element(By.PARTIAL_LINK_TEXT,u"新")

find_element(By.XPATH,"//*[@class='bg s_btn']")

find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su"

XPath 与 CSS定位方式对比

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容