selenium的定位方式
第1種方法:通過絕對路徑做定位(相信大家不會使用這種方式)
By.xpath("html/body/div/form/input")
By.xpath("//input")
第2種方法:通過元素索引定位
By.xpath("//input[4]")
第3種方法:使用xpath屬性定位
By.xpath("//input[@id=‘kw1‘]")
By.xpath("//input[@type=‘name‘ and @name=‘kw1‘]")
第4種方法:使用部分屬性值匹配(最強大的方法)
By.xpath("//input[starts-with(@id,‘nice‘)
By.xpath("//input[ends-with(@id,‘很漂亮‘)
By.xpath("//input[contains(@id,‘那麽美‘)]")
starts-with 顧名思義,匹配一個屬性開始位置的關鍵字
contains 匹配一個屬性值中包含的字符串
text() 匹配的是顯示文本信息,此處也可以用來做定位用
舉例
//input[starts-with(@name,‘name1‘)] 查找name屬性中開始位置包含‘name1‘關鍵字的頁面元素
//input[contains(@name,‘na‘)] 查找name屬性中包含na關鍵字的頁面元素
<a href="http://www.baidu.com">百度搜索</a>,那麽xpath寫法為 //a[text()=‘百度搜索‘] 或者 //a[contains(text(),"百度搜索")]
三.有時候切換到iframe可能會遇見的問題
當然實際情況中會遇到沒有id屬性和name屬性為空的情況,這時候就需要先定位iframe元素對象,這裏可以通過tag先定位到,也能達到同樣效果。
如下代碼:
iframe = driver.find_element_by_tag_name("iframe")
driver.switch_to_frame(iframe)
(1) 切換完了之後,就可以去正常定位iframe裏面的元素,driver.find_element_by_tagname(table) 之類的,同時也可以用xpath的方式:例如 Xpath=//*[contains(@src, ‘sysmanage/systemupgrade.action‘)]
(2) 如果有多個iframe標簽,那你就要看看總共有iframe標簽了,看看你所定位的iframe是數組中的第幾個iframe元素(從0開始數起,基於JavaScript的),可以用chrome瀏覽器的F12的控制臺(Console)就可以輸入document.getElementsByTagName(‘iframe‘).length這句代碼,即可打印出iframe的長度(也就是個數),然後按照從0開始數起。
(3)當iframe上的操作完後,想重新回到主頁面上操作元素,這時候,就可以用switch_to_default_content()方法返回到主頁面。
如下代碼:
iframe = driver.find_element_by_tag_name("iframe")
driver.switch_to_frame(iframe)
switch_to_default_content()
(4)如何判斷元素是否在iframe上?
1.定位到元素後,切換到firepath界面。
2.看firebug工具左上角,如果顯示Top Window說明沒有iframe。
3.如果顯示iframe#xxx這樣的,說明在iframe上,#後面就是它的id。
四.selenium用javascript定位
除了id是定位到的是單個element元素對象,其它的都是elements返回的是list對象
1.通過id獲取
document.getElementById(“id”)
2.通過name獲取
document.getElementsByName(“Name”)
返回的是list
3.通過標簽名選取元素
document.getElementsByTagName(“tag”)
4.通過CLASS類選取元素
document.getElementsByClassName(“class”)
兼容性:IE8及其以下版本的瀏覽器未實現getElementsByClassName方法
5.通過CSS選擇器選取元素
document.querySelectorAll(“css selector")
兼容性:IE8及其以下版本的瀏覽器只支持CSS2標準的選擇器語法
js = ‘document.getElementById("helloId").click();‘
driver.execute_script(js)
js1 = ‘document.getElementsByClassName("helloName")[0].value = "王大明";‘ //整個HTML文檔裏第一個使用CSS樣式類的class="helloName"屬性,它的value屬性的值設置為“王大明”
driver.execute_script(js1)
JQuery是2006年1月誕生的一個基於封裝JavaScript的框架,你經常看到的美元符號帶上一個圓括號$(‘XXX‘),其實就是document.getElementBy什麽什麽的這個js方法,至於XXX前面帶.的話,就是document.getElementByClass,帶#的話,就是document.getElementById
6.xpath的語法使用基礎
Xpath的使用方法:
例子 1:html/body/div[1]/div[2] (如果不熟悉html的朋友們,需要自行百度html。)
該xpath 表示 : 在 html標簽下 -> body標簽下 -> 第一個div標簽下 -> 第二個div標簽
很好理解,繼續
例子 2:.//*[@id=‘content‘]/div[2]/ul
這樣會有人不理解了 .//*[@id=‘content‘] 到底是什麽意思呢?
. 代表當前路徑
a//b 表示:在a標簽下的子孫輩b標簽
* 可以是任何標簽
[@id=‘content‘] 表示是 id 為 content
所以:這個例子的意思是: id 為 content 的任何子標簽下面 -> 第二個 div標簽下 -> ul 標簽
Xpath基礎學習完畢,接下來開始進階學習
//p[text()=‘a‘] :文本為 a 的p標簽
//p[text()=‘a‘] : 文本包含 a 的p標簽
//a[@class=‘abc‘] :class 為 a的 p標簽 (當然咯。既然可以為 @class 就一定能用 @id ,為什麽不聯想下 @src 和@href呢?)
//p[not(@class=‘a‘)] :class 不為 a的 p標簽
好了,進階完畢,如果要使用更高階的Xpath要先屬性以上內容,然後聯合 Selenium使用
Xpath和其他定位方式的比較:(主要是和CSS定位的對比)
Xpath的最大好處是能向上查找,不過缺點是速度過慢。
css定位介紹
CSS定位速度快,功能多,但是不能向上查找,比xpath好用,執行效率比xpath來的快,曾經做過兩種定位比較的測速,是本人認為最好用的定位方式。 大致用法總結: 1、*:checked 選中*的checked元素 2、 li.refined.list.group.item (如果class中間有空格,可以.+.+.全寫也可以只寫任意一個).checkbox[type^=‘check‘][onclick*=‘Bebe‘][checked$=‘ed‘] +a
(開頭^= 包含*= 結尾$= )+a 是選中同級的後面的a 3、 li a :選中 li 標簽的後代 a 5、 li>a :選中 li 標簽的子元素 a 4、 li,a :選中 li 和 a 5、 li +a :選中 li 同級的 下一個 a 6、 li ~a :選中 li 同級的 下面所有的 a 7、 li>a:last-child / li>a:last-of-type : 選中 li 下最後面一個 a 8、 li:not([class*=‘_‘]) : li 中的 calss 不含 ‘_‘ li:not(:nth-of-type(1)) : 不含第一個 li 的所有 li 9、 li>a:nth-child(n) / li>a:nth-of-type(n) :選中 li 下第 n 個 a li>a:nth-last-child(n) / li>a:nth-last-of-type(n):選中 li 下,倒數第 n 個 a 如果 n = odd 表示奇數 如果 n = even 表示偶數
div h2:nth-child(n) : 當div的第n個子元素是h2的時候 div h2:nth-of-type(n): div下第n個h2子元素 10、 div[style] : div中包含 屬性style 11、 li>a:only-child :li 下只有1個a的 a 標簽
selenium的定位方式