My_Project

资料整理


selenium-元素定位

<p><strong>1.介绍</strong></p> <p>1.1环境及工具</p> <pre><code>1)firefox35 2)firebug插件 3)firepath插件</code></pre> <p>1.2原因</p> <pre><code>1.1 计算机没有智能到人的程度; 1.2 计算机不能像手动测试人员一样通过眼看,手操作鼠标点击,操作键盘输入; 1.3 计算机通过一系列计数手段找到元素(按钮、输入框、模拟键盘等);</code></pre> <p><strong>2.八种常见元素定位的方式</strong></p> <p>2.1 id定位</p> <pre><code>说明:id定位为元素属性定位;HTML规定id属性在整个HTML文档中必须是唯一的; 前提:元素有id属性; 定位方式:find_element_by_id()</code></pre> <p>2.2 name定位</p> <pre><code>说明:name定位为元素属性定位;HTML规定name属性来指定元素名称,因此它的作用更像人名,name的属性值在当前文档中可以不是唯一的; 前提:元素有name属性; 定位方式:find_element_by_name()</code></pre> <p>2.3 class_name定位</p> <pre><code>说明:class_name定位为元素属性定位;HTML规定了class来指定元素的类名,用法和name、id类似; 前提:元素有class属性; 定位方式:find_element_by_class_name()</code></pre> <p>2.4 tag_name定位</p> <pre><code>说明:tag_name定位为元素标签名称定位;HTML本质就是由不同的tag(标签)组成,而每个tag都是指同一类,所以tag定位效率低,一般不建议使用; 定位方式:find_element_by_tag_name()</code></pre> <p>2.5 link_text定位</p> <pre><code>说明:link_text定位为超链接定位(a标签);link_text定位与前面4个定位有所不同,它专门用来定位超链接文本(&lt;a&gt;标签&lt;/a&gt;); 定位方式:find_element_by_link_text() 说明:需要传入a标签全部文本(访问 新浪 网站),为精确匹配方式;</code></pre> <p>2.6 partial_link_text定位</p> <pre><code>说明:partial_link_text定位为超链接定位(a标签);partial_link_text定位是对link_text定位的补充; 定位方式:find_element_by_partial_link_text() 说明:需要传入a标签局部文本(访问 新浪 网站),为模糊匹配方式;</code></pre> <p>2.7 Xpath定位</p> <pre><code>2.7.1 概念 1. XPath即为XML Path 的简称,它是一种用来确定XML文档中某部分位置的语言。 2. HTML可以看做是XML的一种实现,所以Selenium用户可以使用这种强大的语言在Web应用中定位元素。 XML:一种标记语言,用于数据的存储和传递。 后缀.xml结尾 提示:Xpath为强大的语言,那是因为它有非常灵活定位策略 2.7.2 定位策略(方式) 2.7.2.1 路径-定位 绝对路径:从最外层元素到指定元素之间所有经过元素层级路径 ;如:/html/body/div/p[2] 提示: 1). 绝对路径以/开始 2). 使用Firebug可以快速生成,元素XPath绝对路径 相对路径:从第一个符合条件元素开始(一般配合属性来区分);如://input[@id='userA'] 提示: 1). 相对路径以//开始 2). 使用Friebug扩展插件FirePaht可快速生成,元素相对路径 提示:为了方便练习Xpath,可以在FireBug内安装扩展插件-FireFinder插件; 1). 火狐浏览器--&gt;组件管理器--&gt;搜索FireFinde 2.7.2.2 利用元素属性-定位 说明:快速定位元素,利用元素唯一属性; 示例://*[@id='userA'] 2.7.2.3 层级与属性结合-定位 说明:要找的元素没有属性,但是它的父级有; 示例://*[@id='p1']/input 2.7.2.4 属性与逻辑结合-定位 说明:解决元素之间个相同属性重名问题 示例://*[@id='telA' and @class='telA'] 2.7.3 定位方式 driver.find_element_by_xpath() 2.7.4 Xpath-延伸 //*[text()="xxx"] 文本内容是xxx的元素 //*[starts-with(@attribute,'xxx')] 属性以xxx开头的元素 //*[contains(@attribute,'Sxxx')] 属性中含有xxx的元素</code></pre> <p>2.8 CSS选择器定位</p> <p>2.8.1 概念</p> <pre><code>1. CSS(Cascading Style Sheets)是一种语言,它用来描述HTML和XML的元素显示样式; css语言书写两个格式: &lt;1&gt; 写在HTML语言中&lt;style type="text/css"&gt;... &lt;2&gt;写在单独文件中 后缀.css 2. 而在CSS语言中有CSS选择器(不同的策略选择元素),在Selenium中也可以使用这种选择器; 提示: 1. 在selenium中极力推荐CSS定位,因为它比XPath定位速度要快 2. css选择器语法非常强大,在这里我们只了解在测试中常用的几个</code></pre> <p>2.8.2 定位策略(方式)</p> <p>2.8.2.1 id选择器</p> <pre><code>说明:根据元素id属性来选择 格式:#id 例如:#userA &lt;选择id属性值为userA的所有元素&gt;</code></pre> <p>2.8.2.2 class选择器</p> <pre><code>说明:根据元素class属性来选择 格式:.class 例如:.telA &lt;选择class属性值为telA的所有元素&gt;</code></pre> <p>2.8.2.3 元素选择器</p> <pre><code>说明:根据元素的标签名选择 格式:element 例如:input &lt;选择所有input元素&gt;</code></pre> <p>2.8.2.4 属性选择器</p> <pre><code>说明:根据元素的属性名和值来选择 格式:[attribute=value] 例如:[type="password"] &lt;选择所有type属性值为password的值&gt;</code></pre> <p>2.8.2.5 层级选择器</p> <pre><code>说明:根据元素的父子关系来选择 格式:element&gt;element 或element element 或p [type='password'] 例如:p&gt;input &lt;返回所有p元素下所有的input元素&gt; 提示:&gt; 可以用空格代替 例如:p&gt;input = p input = p [type='password']</code></pre> <p>2.8.3 定位方式</p> <pre><code>driver.find_element_by_css_selector()</code></pre> <p>2.8.4Xpath-延伸</p> <pre><code>1. input[type^='p'] 说明:type属性以p字母开头的元素 2. input[type$='d'] 说明:type属性以d字母结束的元素 3. input[type*='w'] 说明:type属性包含w字母的元素</code></pre> <p>2.9 XPath与CSS类似功能对比</p> <pre><code>2.9.1 元素名 定位方式:元素名 XPath://input CSS:input 2.9.1 id 定位方式:id XPath://input[@id='userA'] CSS:#userA 2.9.1 class 定位方式:class XPath://*[@class='telA'] CSS:.telA 2.9.1 属性 定位方式:属性 XPath: 1. //※[text()="xxx"] 2. //※[starts-with(@attribute,'xxx')] 3. //※[contains(@attribute,'xxx')] CSS: 1. input[type^='p'] 2. input[type$='d'] 3. input[type*='w']</code></pre> <p>2.10 元素定位方式拓展:S</p> <pre><code>方法: find_element[s]_by_XXX() 作用: 1). 查找定位所有符合条件的元素; 2). 返回的定位元素格式为数组(列表)格式; 说明: 1). 列表数据格式的读取需要指定下标(下标从0开始)</code></pre> <p>2.11 元素定位方式拓展:By类</p> <pre><code>方法: find_element(By.ID,"userA") 导包: from selenium.webdriver.common.by import By 备注:需要两个参数,第一个参数为定位的类型由By提供,第二个参数为定位的具体方式; 示例: 1. driver.find_element(By.CSS_SELECTOR,'#emailA').send_keys("123@126.com") 2. driver.find_element(By.XPATH,'//*[@id="emailA"]').send_keys('234@qq.com') 3. driver.find_element(By.ID,"userA").send_keys("admin") 4. driver.find_element(By.NAME,"passwordA").send_keys("123456") 5. driver.find_element(By.CLASS_NAME,"telA").send_keys("18611111111") 6. driver.find_element(By.TAG_NAME,'input').send_keys("123") 7. driver.find_element(By.LINK_TEXT,'访问 新浪 网站').click() 8. driver.find_element(By.PARTIAL_LINK_TEXT,'访问').click()</code></pre> <p>2.12 find_element_by_xxx()和find_element() 区别</p> <pre><code>说明:通过查看find_element_by_id底层实现方法,发现底层也是调用的By类方法进行的封装; 总结:虽然方法一样,但WebDriver推荐 find_element_by_xxx()这种方法 def find_element_by_id(self, id_): """Finds an element by id. :Args: - id\_ - The id of the element to be found. :Usage: driver.find_element_by_id('foo') """ return self.find_element(by=By.ID, value=id_)</code></pre>

页面列表

ITEM_HTML