莫愁前路无知己,天下谁人不识君。。。。

python(2.7)+selenium(3.0)+chrome(57)定位动态ID

上一篇 / 下一篇  2017-04-27 09:55:52 / 个人分类:测试技巧

我们在进行自动化测试,定位元素常用的做法就是,右键--copy---copy xpath,因为这种方法简单,不用动脑筋,很多时候这种方法是行的通,但有时会遭遇滑铁卢,怎么运行都run不起来,甚至第一次可以run,第二次not run.今天可以,过段时间就不行。看看浏览器没有升级啊,怎么会呢?这就是动态id惹得祸。。。怎样才知道是不是动态id,打开一个窗口,定位元素,关闭后重新打开。看看定位同一个元素的id是否一致,不一致就是动态id。如下面的html是一个点击一个保存按钮后,定位弹出提示框中的”是“的元素,id动态变化,第一次用id可以run,第二次就报错!!!

<td class="x-btn-mc">
   <em class="" unselectable="on"> 
       <button type="button" id="ext-gen374" class=" x-btn-text">是</button>
   </em>
</td>

way1:driver.find_element_by_id("ext-gen374").click()  错错错
way2:driver.find_element_by_xpath('//*[@id="ext-gen374"]').click() 还是错错错
way3:driver.find_element_by_xpath("//button[text()='是']").click()  对!对!!对!!!
way4:driver.find_element_by_xpath("//button[contain(text(),'是')]").click() 对!!!

又有人会问,如果不是button,咋办,怎么办。。。一样的,div/span,替换button,ok!!!

不是动态id的话,无法定位元素,主要从frame(没有转换框架driver.switch_to_frame(framename)),时间等待(时间停顿过少)这两个原因考虑。其它很少见,至于定位元素的方法网上一搜一大堆,我就不在这里献丑

还有一种很特殊情况,就是有一种文本框,你必须单击之后,它才会出现输入框,才能输入文本,也就是你单击它时定位元素1,弹出文本框时,定位元素2,这两个定位是不一样的。当初用火狐seleniumIDE录制时,单击和定位的元素是一样,放在pycharm中,始终报错,提示can not focus element 或can not find element!!!

way1:使用两个不同元素定位
driver.find_element_by_xpath(元素1).click()
time.sleep(2)
driver.find_element_by_xpath(元素2).send_keys('1000')

way2:
pa=driver.find_element_by_xpath(元素1).click()
actions=webdriver.ActionChains(driver)
actions.move_to_element(pa)
actions.click()
actions.send_keys('1000')
actions.perform()
记得开头引用selenium.webdriver.common.action_chainsimportActionChains

这两种方法都可以,任你自己选择。
也可以使用下面方法
利用//span[contains(@class,'vote-post-up')] class中的任何一个值


TAG: Chrome Python 动态

引用 删除 小幼稚园   /   2017-12-02 15:34:38
5
 

评分:0

我来说两句

Open Toolbar