寫本文是因為,昨天群友在群里就遇到了這類的問題,并且我想想很多初學者的朋友也會有這樣的問題,也有很多入門著也會有這樣的情況,面試程序中面試官也比較喜歡文元素定位一類的問題,本文就為你揭曉selenium元素定位,定位不到的情況有哪些,并一一舉例出來!
另如果有想進群的朋友可以加我VX:qing_an_an,熱愛測驗的朋友,擁有上進心的朋友,歡迎你的加入!
在HTML頁面中,元素定位不到通常需要考慮到是不是需要考慮切換句柄,切換iframe,元素是不是隱藏了,元素是不是寫錯了,遇到了彈窗,遇到了下拉框,還有就是是不是姿勢不對,
目錄
元素錯誤
未切換句柄
超鏈接
iframe標簽
隱藏標簽-元素
滑鼠操作:
JS操作:
下拉框
元素錯誤
注意:此處的元素錯誤指的是你的定位元素寫錯了,而不是指元素本身錯誤,看看例子:

我們定位百度輸入框時采用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()
此處定位不到是因為元素寫錯了,所以這也是初學者最容易放的錯誤,首先要檢查的就是這個問題,其次,我們可以看控制臺錯誤警告:

看到這個錯誤就應該知道是元素錯誤了,正確的應該是:
from selenium import webdriver
fox = webdriver.Firefox()
fox.get("https://www.baidu.com")
fox.find_element_by_id("kw").send_keys('清安')
fox.quit()
未切換句柄
切換句柄是什么意思呢,就是你從百度搜索到下面例子的京東界面,瀏覽器中打開了兩個網頁,你需要從百度的界面跳轉到這么界面,如下:

這里元素定位輸入框是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()

所以你需要切換句柄,怎么操作呢?看代碼
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'),
句柄號截圖我就不擺出來了,瀏覽器不一樣,句柄號格式不一樣,
超鏈接
超鏈接<a>標簽,很多人在不注意的時候一股腦的就猛的定位,然后定位不到了就瘋狂的找原因改其他的標簽定位,看例子

注意:這里明確告訴你超鏈接不能直接定位,但是可以告訴你的是,超鏈接不能直接定位難道輔助定位還不行嗎,
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空間等登錄界面都會看到,我們看圖:

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()
看到此處代碼,如果你想直接去定位,得到的就是:

所以此處我們需要想切換句柄一樣去切換到這個標簽上去!
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(),所以不要慌,
隱藏標簽-元素
在實際的專案中,你是否遇到了有隱藏元素或隱藏標簽的情況,今天就來舉例一個這種情況,以及解決辦法,先看兩張圖:


上面兩張圖,后者是因為點擊了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的一種寫法操作,
對于這類的情況,本人能力有限,只能準備了兩種解決辦法,一種是JS一種是滑鼠操作,一起看看吧:
滑鼠操作:
滑鼠操作前面出過文,不清楚的可以去看看,下面的滑鼠操作處結合這張圖看:

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只要能定位到就好,不必差異:

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

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

看這,這個隱藏的input標簽就顯示出來了,然后我們再次去做輸入的操作即可,看看完整出代碼:
from time import sleep
from selenium import webdriver
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)
# 定位圖示
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畫布控制元件等嘖需要人工去驗證了,這也恰巧說明了自動化其實不能完全代替人為測驗,各位細細體會,最后這種下拉框情況是博主自己加上的,解決方法給到各位,看到這,在此也感謝各位能看完這篇文章,同時也歡迎各位留言!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/306468.html
標籤:其他
