寫本文是因為,昨天群友在群裡就遇到了這類的問題。並且我想想很多初學者的朋友也會有這樣的問題,也有很多入門著也會有這樣的情況。面試過程中面試官也比較喜歡文元素定位一類的問題。本文就為你揭曉selenium元素定位,定位不到的情況有哪些,並一一舉例出來!

selenium——面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了——內附解析跟程式碼解決案例!讓面試官對你刮目相看_清歡無別事-CSDN部落格

另如果有想進群的朋友可以加我VX:qing_an_an,熱愛測試的朋友,擁有上進心的朋友,歡迎你的加入!

在HTML頁面中,元素定位不到通常需要考慮到是不是需要考慮切換控制代碼,切換iframe,元素是不是隱藏了,元素是不是寫錯了,遇到了彈窗,遇到了下拉框,還有就是是不是姿勢不對。

元素錯誤

注意:此處的元素錯誤指的是你的定位元素寫錯了,而不是指元素本身錯誤。看看例子:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

​​我們定位百度輸入框時採用find_by_element_id的方式進行定位,這裡是id=kw,當我們寫成其他的元素如id=wk

from

selenium

import

webdriver

fox

=

webdriver

Firefox

()

fox

get

“https://www。baidu。com”

fox

find_element_by_id

“wk”

send_keys

‘清安’

fox

quit

()

此處定位不到是因為元素寫錯了,所以這也是初學者最容易放的錯誤。首先要檢查的就是這個問題。其次,我們可以看控制檯錯誤警告:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

看到這個錯誤就應該知道是元素錯誤了。正確的應該是:

​​from selenium import webdriver

fox = webdriver。Firefox()

fox。get(“https://www。baidu。com”)

fox。find_element_by_id(“kw”)。send_keys(‘清安’)

fox。quit()

未切換控制代碼

切換控制代碼是什麼意思呢。就是你從百度搜索到下面例子的京東介面,瀏覽器中打開了兩個網頁,你需要從百度的介面跳轉到這麼介面。如下:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

這裡元素定位輸入框是id=key但是你會發現定位不到。

from time import sleep from selenium import webdriver

fox = webdriver。Firefox()

fox。get(“https://www。baidu。com”)

fox。find_element_by_id(“kw”)。send_keys(‘京東’)

fox。find_element_by_id(“su”)。click()

fox。find_element_by_xpath(‘/html/body/div[1]/div[4]/div[1]/div[3]/div[1]/div/div/div[1]/div/div[1]/div/h2/a[1]/em’)。click()

sleep(2)

fox。find_element_by_id(‘key’)。send_keys(‘python’)

fox。quit()

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

所以你需要切換控制代碼,怎麼操作呢?看程式碼

from time import sleep from selenium import webdriver

fox = webdriver。Firefox() fox。get(“https://www。baidu。com”)

fox。find_element_by_id(“kw”)。send_keys(‘京東’)

fox。find_element_by_id(“su”)。click()

fox。find_element_by_xpath(‘/html/body/div[1]/div[4]/div[1]/div[3]/div[1]/div/div/div[1]/div/div[1]/div/h2/a[1]/em’)。click()

sleep(2)

# 獲取當前控制代碼

ele = fox。current_window_handle print(f“當前控制代碼是:{ele}”)

#獲取所有控制代碼

ele_all = fox。window_handles print(f“所有控制代碼號:{ele_all}”)

# 切換控制代碼號

fox。switch_to。window(ele_all[-1]) fox。find_element_by_id(‘key’)。send_keys(‘python’)

fox。quit()

切花控制代碼為什麼我寫的是-1,因為我想去最後一個控制代碼,你也可以看打印出來的控制代碼號是什麼,直接指定切換即可。寫法:fox。switch_to。window(‘123456’)。

控制代碼號截圖我就不擺出來了,瀏覽器不一樣,控制代碼號格式不一樣。

超連結

超連結標籤,很多人在不注意的時候一股腦的就猛的定位,然後定位不到了就瘋狂的找原因改其他的標籤定位。看例子

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

注意:這裡明確告訴你超連結不能直接定位,但是可以告訴你的是,超連結不能直接定位難道輔助定位還不行嗎。

from time import sleep from selenium import webdriver

fox = webdriver。Firefox()

fox。get(“https://www。baidu。com”)

fox。find_element_by_id(“kw”)。send_keys(‘清安無別事’)

fox。find_element_by_id(“su”)。click()

fox。find_element_by_xpath(‘/html/body/div[1]/div[4]/div[1]/div[3]/div[3]/h3/a/em’)。click()

sleep(2)

fox。quit()

這裡舉例我想定位2021年01月_清歡無別事_這條超連結內容並點選,那麼這裡你就用xpath定位,定位到紅色字型的清安無別事。如果你要問為什麼,那就是那裡有一個em標籤,你想定位紅色字型以外的你想定位的超連結是定位不到的。很多時候你可以看到超連結裡面放入了id,name等元素,你可以依靠這些進行定位。

這裡還需要注意的就是,想這種隨著時間的更新頁面會發生變化的,xpath是不準的,所以需要自己維護。

iframe標籤

這個標籤通常在登入的時候會看到,像知乎,QQ空間等登入介面都會看到,我們看圖:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

iframe標籤裡面可以巢狀一個HTML網頁,所以,定位不到的時候記得看看是不是也有這個原因。

from selenium import webdriver

fox = webdriver。Firefox()

fox。get(“https://qzone。qq。com/”)

fox。find_element_by_id(‘switcher_plogin’)。click()

fox。find_element_by_id(‘u’)。send_keys(‘清安無別事’)

fox。find_element_by_id(‘p’)。send_keys(‘歡迎入坑’)

fox。quit()

看到此處程式碼,如果你想直接去定位,得到的就是:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

所以此處我們需要想切換控制代碼一樣去切換到這個標籤上去!

from selenium import webdriver

fox = webdriver。Firefox()

fox。get(“https://qzone。qq。com/”)

# 定位標籤

ifranme = fox。find_element_by_id(‘login_frame’)

# 切換到標籤上

fox。switch_to。frame(ifranme)

fox。find_element_by_id(‘switcher_plogin’)。click()

fox。find_element_by_id(‘u’)。send_keys(‘清安無別事’)

fox。find_element_by_id(‘p’)。send_keys(‘歡迎入坑’)

fox。quit()

此處是有id有那麼的情況,如果沒有這些呢,我們也可以用標籤名來進行定位fox。find_element_by_tag_name(),所以不要慌。

隱藏標籤-元素

在實際的專案中,你是否遇到了有隱藏元素或隱藏標籤的情況。今天就來舉例一個這種情況,以及解決辦法。先看兩張圖:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

上面兩張圖,後者是因為點選了dd右邊的圖示才顯示的元素,遇到這樣的情況你會怎麼辦?

是不是首先想到的就是先點選圖示再去定位輸入框,輸入字元?我們來看看程式碼。

from time import sleep from selenium import webdriver

fox = webdriver。Firefox() fox。get(“https://xxxxxxxx/account/basic”)

fox。find_element_by_id(‘fm-login-id’)。send_keys(‘清安無別事’)

fox。find_element_by_class_name(‘ivu-input。ivu-input-default。ivu-input-with-suffix’)。send_keys(‘qing_an_an’)

fox。find_element_by_class_name(‘fm-button’)。click() sleep(3) # 定點陣圖標 fox。find_element_by_class_name(‘basic-login-img’)。click()

# 定位輸入框更改字元

fox。find_element_by_class_name(‘ivu-imput-wrapper。ivu-input-wrapper-default。ivu-input-type。isRead’)。send_keys(‘清安’)

fox。quit()

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

這裡因為是實際的專案,所以還不能公佈。見諒!這裡提供一定的解決辦法。這裡之所以定位不到是因為點選圖示的時候隱藏的輸入框才會顯現。待你再次點選其他地方的時候就會再次隱藏掉。所以個人拙見,這類操作不符合selenium的一種寫法操作。

對於這類的情況,本人能力有限。只能準備了兩種解決辦法。一種是JS一種是滑鼠操作。一起看看吧:

滑鼠操作:

滑鼠操作前面出過文,不清楚的可以去看看,下面的滑鼠操作處結合這張圖看:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

from time import sleep from selenium import webdriver

from selenium。webdriver。common。action_chains import ActionChains

fox = webdriver。Firefox()

fox。get(“https://www。kameymall。com/account/personal/basic”)

fox。find_element_by_id(‘fm-login-id’)。send_keys(‘1084460197@qq。com’)

fox。find_element_by_class_name(‘ivu-input。ivu-input-default。ivu-input-with-suffix’)。send_keys(‘88888888’)

fox。find_element_by_class_name(‘fm-button’)。click() sleep(3) # 定點陣圖標 fox。find_element_by_class_name(‘basic-login-img’)。click()

# 例項化滑鼠操作

action = ActionChains(fox)

# 定位到輸入框

ele1 = fox。find_element_by_class_name(‘margin’)

# 滑鼠點選並輸入名字

action。click(ele1)

action。send_keys(‘清安’)。perform()

fox。quit()

JS操作:

這裡我用的火狐,不同的瀏覽器複製的定位略有不同,所以你要是用的谷歌,IE只要能定位到就好,不必差異:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

首先用JS去點選這個圖示,點選圖示後隱藏的一些列元素就會展現出來。

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

這裡我點選跟輸入值一起操作了,自己操作的時候可以一步步來:

selenium--面試官問元素定位不到怎麼辦?工作中還在為元素定位不到而煩惱?看這一文就夠了--內附解析跟程式碼解決案例!讓面試官對你刮目相看

看這,這個隱藏的input標籤就顯示出來了,然後我們再次去做輸入的操作即可,看看完整出程式碼:

​​from time import sleep

from selenium import webdriver

fox = webdriver。Firefox()

fox。get(“https://xxxxxx”)

fox。find_element_by_id(‘fm-login-id’)。send_keys(‘10000000’)

fox。find_element_by_class_name(‘ivu-input。ivu-input-default。ivu-input-with-suffix’)。send_keys(‘88888888’)

fox。find_element_by_class_name(‘fm-button’)。click()

sleep(3)

# 定點陣圖標

js_res = “document。querySelector(‘。basic-login-img’)。click())”

fox。execute_script(js_res)

js_value = “document。querySelector(‘。ivu-input。ivu-input-default’)。value=‘清安’”

fox。execute_script(js_value)

fox。quit()

下拉框

這裡最後一種情況就是下拉框的情況了,很多朋友不知道下拉框如何定位,一般定位下拉框往往需要伴隨切換標籤到另一個HTML頁面上去。並且下拉框也需要匯入一個庫來使用,所以此處需要特別注意一下。

此處專案給到各位,可以自行練習。

from time import sleep from selenium import webdriver

from selenium。webdriver。support。ui import Select

fox = webdriver。Firefox() fox。implicitly_wait(2)

fox。get(“http://shop。aircheng。com/ucenter/address”)

fox。find_element_by_name(‘login_info’)。send_keys(‘nswe’)

fox。find_element_by_name(‘password’)。send_keys(‘111111’)

fox。find_element_by_class_name(‘input_submit’)。click()

fox。find_element_by_partial_link_text(‘地址管理’)。click()

sleep(2)

fox。find_element_by_class_name(‘fa。fa-map-marker’)。click()

# 定位標籤

ifranme = fox。find_element_by_name(‘OpenaddressWindow’)

# 切換到標籤上

fox。switch_to。frame(ifranme)

sleep(3)

# 匯入select標籤

ele = fox。find_element_by_name(‘province’)

Select(ele)。select_by_value(‘440000’)

ele_city = fox。find_element_by_name(‘city’)

Select(ele_city)。select_by_visible_text(‘深圳市’)

ele_area = fox。find_element_by_name(‘area’)

Select(ele_area)。select_by_index(5)

sleep(5)

fox。quit()

一搬面試官問元素定位不到一般性指的是前幾種情況,也還有元素還沒載入完導致元素定位不到——需要新增等待時間,也有是因為部分控制元件是不支援元素定位的,比如 canvas畫布控制元件等嘖需要人工去驗證了。這也恰巧說明了自動化其實不能完全代替人為測試。各位細細體會。最後這種下拉框情況是博主自己加上的。解決方法給到各位,看到這,在此也感謝各位能看完這篇文章。同時也歡迎各位留言!