1. 程式人生 > >selenium webdriver對變動元素的定位

selenium webdriver對變動元素的定位

 

最近在看蟲師的selenumiu + python實踐書。

裡面有一個案例實現126郵箱自動登入,碰到兩個問題:

1.iframe切換問題

2.變動元素id的定位問題

 

因為126郵箱的佈局裡面有iframe佈局,所以進行定位輸入框時,必須先切換到對應的iframe下面。

看了很多部落格,切換到iframe時,需要用如下的程式碼:

browser.switch_to.frame('x-URS-iframe')

但是,不知道是126郵箱是否更新了前端的程式碼,現在iframe的對應的id已經從固定的“x-URS-iframe”變更如下:

“x-URS-iframe1542636781200.565”,而這個id號裡面的數字不是固定的,導致用上面switch_to.frame定位時無法定位到。

 

終於看到下面這個哥們的部落格,恍然大悟,最終用”曲線救國“的方式切換並定位到了輸入框:

https://blog.csdn.net/woiangaoiowe/article/details/62226578

>好在可以通過xpath來實現

>先定位到該元素最上一次固定不變的元素位置,然後通過層級關係找到該元素所在的層級,然後實現定位

普通的find_element_by_XXX行不通的時候,用find_element_by_xpath先定位到iframe最接近的祖先元素位置,再通過層級關係找到該元素所在的層級實現定位。

雖然不是用”直接“的方法,但是至少實現了定位這個功能。

下面就是主要的程式碼塊:

driver = webdriver.Chrome()

driver.get("http://www.126.com")

time.sleep(2)

frame1 = driver.find_element_by_xpath('//*[@id="loginDiv"]/iframe')

driver.switch_to.frame(frame1)

 

 

※備註:把iframe對應的“層”以及它的父級“層”的原始碼如下:(用Chrome copy outHTML得到)

<div id="loginDiv" class="loginUrs" style="width: 450px; height: 253px;"><iframe name="" frameborder="0" id="x-URS-iframe1542688360428.6108" scrolling="no" style="width: 100%; height: 100%; border: none; background: none;" src="https://passport.126.com/webzj/v1.0.1/pub/index_dl2_new.html?cd=https%3A%2F%2Fmimg.127.net%2Findex%2F126%2Fscripts%2F2017%2Fpc%2Fcss%2F&amp;cf=urs.f23f092d.css&amp;MGID=1542688360428.6108&amp;wdaId=&amp;pkid=QdQXWEQ&amp;product=mail126"></iframe></div>

⇒126郵箱的iframe寫得也有點“絕,id會變動,class,name這些都為空,定位的確不容易。