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这些都为空,定位的确不容易。

猜你喜欢

转载自blog.csdn.net/sisqzy86/article/details/84294232