三、定位元素的基本方法---重点!!! 1.id定位:使用元素的id属性值来定位,不限定什么类型的元素都可以使用,是通用的定位方法,最建议使用! (1)语法一:调用find_element_by_id函数,参数是目标元素id属性值(str类型),返回网页元素类型的对象,把它赋值给一个变量。 注意:不要调用find_elements_by_id函数。 示例:<input id="username"…… a=driver.find_element_by_id("username") (2)语法二:调用find_element函数,第一个参数写By.ID,第二个参数是目标元素id属性值(str类型),返回网页元素类型的对象,把它赋值给一个变量。 说明:必须要提前导入类By,这是一个专门描述定位方法的类。 导入类By的语法: from selenium.webdriver.common.by import By 示例: a=driver.find_element(By.ID,"username") (3)注意事项:如果使用id定位运行代码时失败,那么多次手工刷新网页,查看id属性值是否每次都不同,如果不同,就不要用id定位。 2.name定位:使用目标元素的name属性值来定位,一般较准确的能定位到元素,建议使用! (1)注意事项:一组单选按钮一般有相同的name属性值,不太建议直接使用name定位。 (2)语法一:调用find_element_by_name函数,参数是name属性值。 示例:<input name="extend_field1"…… e=driver.find_element_by_name("extend_field1") (3)语法二:调用find_element函数,第一个参数写By.NAME,第二个参数是name属性值。 示例: e=driver.find_element(By.NAME,"extend_field1") 3.link text定位:针对标记名称是a的超级链接,可以使用<a>与</a>之间的链接文本来定位,建议使用。 (1)语法一:调用find_element_by_link_text函数,参数是<a>与</a>之间的链接文本(完整的文本)。 示例: <a href="search.php?act=advanced_search">高级搜索</a> gao=driver.find_element_by_link_text("高级搜索") (2)语法二:调用find_element函数,第一个参数是By.LINK_TEXT,第二个参数是<a>与</a>之间的链接文本(完整的文本)。 示例: gao=driver.find_element(By.LINK_TEXT,"高级搜索") (3)特殊情况说明:如果<a>与</a>之间既有文本,也有子元素,忽略子元素,使用文本也可以定位,如果子元素里也有文本,需要拼接在一起作为参数,或直接使用partial link text定位,如果<a>与</a>之间没有文本,那么不能使用link text定位。 示例: <a href="message.php">留言板<span></span></a> liu=driver.find_element(By.LINK_TEXT,"留言板") 4.partial link text定位:是对link text的补充,也是针对标记名称是a的元素使用的,使用一部分链接文本作为参数来定位,一般针对文本较长、或文本里包含动态数据时使用的。 (1)注意事项:尽量选择它自己特有的那一部分文本,其他链接文本不包含的作为定位参数。 (2)语法一:调用find_element_by_partial_link_text函数,参数写一部分文本。 (3)语法二:调用find_element函数,第一个参数By.PARTIAL_LINK_TEXT,第二个参数写一部分文本。 示例: <a href="flow.php" title="查看购物车">您的购物车中有 0 件商品,总计金额 ¥0.00元。</a> # 点击部分文本是“您的购物”的超级链接 nin=driver.find_element(By.PARTIAL_LINK_TEXT,"您的购物") 5.class name定位:使用目标元素的class属性值来定位,建议尽量少用,因为定位可能会不准确。 示例: # 输入姓名---语法一 xingming=driver.find_element_by_class_name("username") xingming.send_keys("jack") # 输入密码---语法二 mima=driver.find_element(By.CLASS_NAME,"password") mima.send_keys("123") 案例:Selenium资料02-seleniumday04.zip解压缩 2-seleniumday04(for student)seleniumday0401demo 5-classname.html,复制该文件,粘贴到C:wampwww里,用Firefox访问http://localhost/05-classname.html 6.tag name定位:使用元素的标记名称来定位,建议尽量少用,因为可能定位不准确。 (1)语法一:find_element_by_tag_name函数,参数写目标元素的标记名称。 (2)语法二:find_element函数,参数一是By.TAG_NAME,参数二写目标元素的标记名称。 示例: logo=driver.find_element(By.TAG_NAME,"img") (3)说明:一个网页可能有多个相同标记的元素,使用find_element或find_element_by_tag_name的话,只能定位到整个网页里的第一个符合条件的元素。 二、查找元素的函数 1.find_element或find_element_by_……函数:查找满足参数条件的第一个元素,返回页面元素对象。如果找不到,会抛出NoSuchElementException(没有找到元素的异常) 2.find_elements或find_elements_by_……函数:查找满足参数条件的所有元素,返回一个list,list里是网页元素类型的对象。如果找不到,会返回一个空的list,不会抛出异常。 示例: # 点击“留言类型”单选按钮中的第4个 shouhou=driver.find_elements(By.NAME,"msg_type")[3] shouhou.click() 3.注意事项:所有find开头的函数查找到的元素如果赋值给一个变量来保存,在下一次网页刷新之前是有效的,一旦网页刷新了,那么这个变量就失效了(抛出StaleElementReferenceException),需要重新定位后再次赋值给变量才能使用它。 示例: # 输入搜索关键字a guan=driver.find_element(By.ID,"keyword") guan.send_keys("a") # 点击“搜索” sou=driver.find_element(By.NAME,"imageField") sou.click()#---刷新网页 guan=driver.find_element(By.ID,"keyword")#重新定位 guan.send_keys("c") 三、高级定位之xpath定位---重点! 1.小结: (1)定位元素的基本方法:id、name、link text、partial link text、class name、tag name (2)定位元素的高级方法:xpath、css selector 2.xpath定位:使用xpath表达式作为定位参数来定位。xpath表达式是一门独立的技术,不依赖于selenium而存在,前端开发人员开发网页也可以使用这种技术。 (1)xml:可扩展的标记语言,是对html的扩展,标记名称和属性名称都是可以自定义的。 (2)xpath:是xml path(xml路径语言),用描述节点或节点集所在的路径来查找元素或属性的一种技术。我们可以使用xpath表达式来定位html网页里的一个元素或一组元素。 (3)语法一:find_element_by_xpath("xpath表达式") 语法二:find_element(By.XPATH,"xpath表达式") (4)xpath表达式分为: a.绝对路径xpath:从根节点开始描述(对于html网页来说,根节点就是html),以/开头或根节点标记名称开头。---尽量少用! 示例:/html/body/div/a或html/body/div/a b.相对路径xpath:从中间层节点开始描述,以//开头或.//开头。尽量使用相对路径xpath,因为更容易维护和管理。 示例://*[@id="kw"] (5)初学者可以使用一些工具来生成xpath表达式 a.Chrome浏览器自带的F12功能里:源代码中目标元素上右击菜单里Copy---Copy xpath b.Firefox里安装插件:比如FirePath或Selenium IDE、xpath finder、webdriver element locator等。 (6)说明:FirePath是Firefox的Firebug插件的一个扩展插件,可以生成xpath,也可以校验xpath是否正确。 a.安装包: 下载firepathfirepath-0.9.7.1-fx.xpi,拖拽firbug安装包到Firefox,安装后,再拖拽firepath安装包到Firefox,重启Firefox,如果打开网页后,在元素右击菜单里出现Inspect in FirePath和“使用Firebug查看元素”这两项代表已经安装成功。 b.生成xpath:在Firefox里打开网页,目标元素上右击菜单里选择Inspect in FirePath 3.xpath定位的优缺点: (1)优点:功能强大。 (2)缺点:可读性差,建议增加注释。 4.xpath语法:在xpath语法里开头处写//代表在整个网页里找某个元素,/用来分隔父子关系的节点。 (1)最简单的xpath://标记名称 ---网页里所有该标记的元素。 示例: //a ---网页里所有超级链接 //input ---所有input标记的元素 //select ---所有下拉列表 (2)在目标节点标记名称前用/分隔,写它的父节点,如果还不准确,还可以继续往前面级别加祖先节点。 示例: //form/a ---高级搜索 (3)谓词:在每个标记名称后都可以加[]来描述筛选条件,这个称为“谓词”。 a.[索引号] :同父下同标记名称的兄弟关系节点的顺序号,从1开始编号。---常用! 示例: //tr[3]/td/input[4] ---售后单选按钮 //form/input[2] ---搜索按钮 //font/a[1]/img ---登录图片 //font/a[2]/img ---注册图片 b.[@属性名称='属性值']:用属性值来筛选。---常用! 示例: //a[@name='top']/img ---logo //input[@value='我要留言'] ---“我要留言”按钮 //a[@href='user.php']/img ---登录图片 //li/a[@href='flow.php'] 或//li[@id='topNav']/a[1] 或//li[@id='topNav']/a[@href='flow.php'] ---查看购物车 c.[@属性名称]:用存在某名称的属性来筛选。 示例: //input[@checked] ---默认选中的那个单选按钮 d.[标记名称]:存在特定标记名称子节点的父元素 示例: //td[textarea] ---找有子节点textarea的父节点td //form[select]/a ---高级搜索 e.[标记名称='文本值']:存在特定标记名称子节点,并且该子节点的开始和结束标记之间存在特定文本值,用这个条件筛选父元素。 示例: //tr[td='电子邮件地址']/td[2]/input ---电子邮件地址所在行第二列的文本框 //form[a='高级搜索']/input[1] ---高级搜索所在的表单区里的文本框(关键字文本框) (4)多条件筛选:---了解! a.写法一: 在标记名称后连续写多个[],每个[]里写一个条件,这些条件同时满足的元素会被筛选出来。 示例: //input[@id='keyword'][@name='keywords'][@class='B_input'] b.写法二:在一个[]里写多个条件,用and表示与,or表示或,[条件1 and 条件2] [条件1 or 条件2] 示例: //input[@id='keyword' and @name='keywords'] //input[@id='keyword' or @name='imageField'] (5)通配符(星号、*)---建议少用! a./*或//* 表示任意标记名称 示例: //form/* //form/*[@class='B_input'] //*[@class='B_input'] b.@* 表示任意属性名称 示例: //div[@*='search'] (6)常用函数: a.last函数:无参,返回兄弟关系中最后一个节点的索引号(也就是兄弟节点的个数),一般用于兄弟关系节点较多或兄弟关系节点个数不确定时从后往前按照索引号筛选(找倒数第几个)的情况。 示例: .//*[@id='mainNav']/a[last()-1] ---留言板 .//*[@id='compareForm']/div/div/div[last()]/a[1]/img ---最后一个商品的图片 //option[last()] ---最后一个选项 b.text函数:无参,返回当前节点的开始和结束标记之间的文本值,可以作为判断的数据。 示例: //a[text()='高级搜索'] ---等价于link text的定位效果 //option[text()='手机类型'] //b[text()='评论'] //span[text()='留言板'] 一、高级定位之xpath定位---重点! 4.xpath语法: (6)常用函数: c.contains函数:有2个参数,判断第1个参数值里是否包含第2个参数值,返回值是一个布尔值。 示例: //input[@id='keyword'] //input[contains(@id,'key')]---关键字文本框 //img[contains(@src,'logo.gif')] ---ECSHOP商标 //a[contains(@href,'advanced')]---高级搜索 //a[contains(text(),'高级')]---高级搜索,等价于partial link text定位的定位效果 //option[contains(text(),'耳机')] ---耳机选项 //span[contains(text(),'总计')]/b ---总计 4 个记录 //font[contains(text(),'光临')]/a[1]/img ---登录 d.position函数:无参,获得当前节点的索引号,一般用于定位一组元素时判断索引号的范围。---了解! 示例: //a[position()>8] ---积分商城、留言板、EC论坛 (7)描述节点之间关系的符号: a./ 代表通过父节点找下一级子节点(逐级查找) b.// 代表通过祖先节点找后代节点(跳级查找) 示例: //table//textarea c.一个点(.) 代表当前节点,使用很少。 d.两个点(..) 代表上一级节点(父节点) 示例: //textarea/.. ---td //textarea/../.. ---tr //textarea/../../.. ---tbody //textarea/../../../tr[1]/td[2] ---第1行第2列 练习:书写“搜索”按钮的xpath表达式,尽量多的写。 .//*[@id='searchForm']/input[2] //input[@name='imageField'] //input[@class='go'] //input[@class='go'][@name='imageField'] //input[@class='go' and @name='imageField'] //form[@id='searchForm']/input[2] //div[@id='search']/form/input[2] //div[@id='search']//input[2] //select/../input[2] //a[text()='高级搜索']/../input[2] //form[@id='searchForm']/input[last()]