<译>Selenium Python Bindings 4 - Locating Eelements
有各种不同的策略来定位页面中的元素。你可以使用最合适定位方式用于你的用例。Selenium提供了以下方法来定位页面中的元素:
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
为了找到多个元素(这些方法会返回一个列表):
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
- Locating by
ID
当你知道一个元素的id属性,请使用方法。在此策略下,与id属性值相匹配的位置的第一个元素将被返回。如果没有元素能匹配id属性,一个NoSuchElementException异常将抛出。
为了测试,考虑这个页面的源代码:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> </form> </body> <html>
表格元素可以这样定位:
login_form = driver.find_element_by_id(‘loginForm‘)
- Locating by
Name
当你知道一个元素的name属性,请使用方法。在此策略下,与name属性值相匹配的位置的第一个元素将被返回。如果没有元素能匹配name属性,一个NoSuchElementException异常将抛出。
为了测试,考虑这个页面的源代码:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> <html>
username & password 元素可以这样定位:
username = driver.find_element_by_name(‘username‘) password = driver.find_element_by_name(‘password‘)
页面中第一个"continue"会被先执行(当元素的name一样时,先被定位的先执行),代码如下:
continue = driver.find_element_by_name(‘continue‘)
- Locating by XPath
XPath是一种用于在XML文档中定位节点使用的语言。HTML可以当作是XML ( XHTML )的实现,Selenium用户可以利用这个强大的语言定位他们Web应用程序中的元素。 XPath继承超出(以及配套)由id或name属性定位的简单方法,并开辟了各种新的可能性,如定位页面上的第三个复选框。
使用XPath最主要的原因是,当你想定位元素没有合适的id或name属性。您可以使用XPath定位元素的绝对路径(不建议) ,或相对于确实有一个id或name属性的元素。 XPath定位,也可用于其他指定的其他元素。
绝对的XPath包含从根(HTML)的所有元素的位置,其结果有可能会失败。通过查找附近有一个id或name属性的元素,你可以根据关系找到您的目标元素。这是不太可能改变的关系,可以让你的测试更强大。
为了测试,考虑这个页面的源代码:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> <html>
页面form元素可以这样定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]") login_form = driver.find_element_by_xpath("//form[1]") login_form = driver.find_element_by_xpath("//form[@id=‘loginForm‘]")
①绝对路径
②页面HTML中第一个form
③form元素的id属性
username 元素可以这样定位:
username = driver.find_element_by_xpath("//form[input/@name=‘username‘]") username = driver.find_element_by_xpath("//form[@id=‘loginForm‘]/input[1]") username = driver.find_element_by_xpath("//input[@name=‘username‘]")
clear_button = driver.find_element_by_xpath("//input[@name=‘continue‘][@type=‘button‘]") clear_button = driver.find_element_by_xpath("//form[@id=‘loginForm‘]/input[4]")
- Locating Hyperlinks by Link
Text
当你知道一个锚标签中使用的链接文本可以使用此方法。在此策略下,与链接文本值相匹配的位置的第一个元素将被返回。如果没有元素能匹配name属性,一个NoSuchElementException异常将抛出。
测试用HTML代码如下:
<html> <body> <p>Are you sure you want to do this?</p> <a href="continue.html">Continue</a> <a href="cancel.html">Cancel</a> </body> <html>
可以使用下面的方法来定位link:
continue_link = driver.find_element_by_link_text(‘Continue‘) continue_link = driver.find_element_by_partial_link_text(‘Conti‘)
- Locating Elements by Tag
Name
当你想使用标签定位元素的时候,你可以使用此方法。使用此策略,第一个和元素匹配的标签将被返回,如果没有,则会异常抛出:
测试用HTML代码:
<html> <body> <h1>Welcome</h1> <p>Site content goes here.</p> </body> <html>
当你想定位(h1)元素的时候,你可以这样定位:
heading1 = driver.find_element_by_tag_name(‘h1‘)
- Locating Elements by Class
name
当你想使用元素class属性名定位的时候,你可以使用此策略。页面第一个匹配的class 名将被返回,如果没有匹配的class name,则会抛出异常:
测试用HTML代码:
<html> <body> <p class="content">Site content goes here.</p> </body> <html>
p标签定位方法如下:
content = driver.find_element_by_class_name(‘content‘)
- Locating Elements by CSS
Selectors
当你想通过CSS选择器定位元素的时候,你可以使用此策略,如果没有匹配的css选择器,那么异常将会抛出:
测试用HTML代码如下:
<html> <body> <p class="content">Site content goes here.</p> </body> <html>
定位方法如下:
content = driver.find_element_by_css_selector(‘p.content‘)
<译>Selenium Python Bindings 4 - Locating Eelements,古老的榕树,5-wow.com
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。