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&cf=urs.f23f092d.css&MGID=1542688360428.6108&wdaId=&pkid=QdQXWEQ&product=mail126"></iframe></div>
⇒126郵箱的iframe寫得也有點“絕,id會變動,class,name這些都為空,定位的確不容易。