近朱者赤,近墨者黑。
selenium录制回放找不到元素的问题
上一篇 /
下一篇 2016-03-08 22:15:57
/ 个人分类:自动化测试
最近弄懂一点
Selenium的使用,但是仅仅是初步的上手。昨天录制了个登陆购物的用例,回放就频频出问题。这边页面上明明有id元素,但是回放时再三报错,“element id=********** not found",我查了不少资料。归纳下页面查找不到
元素的可能原因。
1、要跳转的页面还没有加载完,这样会导致回放时找不到相应id元素。
2、回放时,元素所在的iframe有变化,而回放脚步没有做改动,导致找不到元素。
由于需要定位的元素在某一个frame里边,所以有时通过单独的id/name/xpath还是定位不到此元素。
比如以下一段xml源文件:
<iframe id="left_frame" scrolling="auto" frameborder="1" src="index.php?m=Index&a=Menu" name="left_frame" noresize="noresize" style="height: 100%;visibility: inherit; width: 100%;z-index: 1"><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body class="menuBar">
<div id="menu_node_type_0">
<table width="184" cellspacing="0" cellpadding="0" border="0">
<tr>
<td id="c_1">
<table class="menuSub" cellspacing="0" cellpadding="0" border="0" align="center"></td>
<tr class="sub_menu">
<td>
<a href="index.php?m=Coupon&a=SearchCouponInfo" target="right_frame">密码重置</a>
</td>
</tr>
原本可以通过
WebElement element = driver.findElement(By.linkText("密码重置")); 来定位此元素,
但是由于该元素在iframe id="left_frame"这个frame里边, 所以需要通过先定位frame然后再定位frame里边的某 一个元素的方法定位此元素。
WebElement element =driver.switchTo().frame("left_frame").findElement(By.linkText("密码重置"));
3、对于弹出窗口,要让selenium获取当前窗口的句柄,具体可以使用windowHandles实现,让selenium定位到当前窗口,然后才能定位到要操作的元素。
4、元素不在同一个frame里边,查找需要重新定位
很多页面是左边一栏属于left_frame,右侧属于right_frame的情况,此时如果当前处在left_frame,就无法通过id定位到right_frame的元素。此时需要通过以下语句切换到默认的content:
driver.switchTo().defaultContent();
例如当前所在的frame为left_frame
WebElement saledetail_ele = driver.switchTo().frame("left_frame").findElement(By.linkText("销售明细"));
saledetail_ele.click();
需要切换到right_frame
driver.switchTo().defaultContent();
Select audi_select2 = new Select(driver.switchTo().frame("right_frame").findElement(By.id("coupon_type_str")));
audi_select2.selectByVisibleText("售后0小时");
5、动态id定位不到元素:
举个例子来说:
WebElement compose_ele=driver.findElement(By.id("_mail_component_82_82"));
WebElement compose_ele=driver.findElement(By.xpath("//span[contains(.,'写信')]"));
compose_ele.click();
这一段代码注释掉的部分为通过id定位element的,但是此id"_mail_component_82_82"后面的数字会随着你每次登陆而变化,此时就无法通过id准确定位到element.
因此推荐使用xpath这种方法来查找定位元素。
最后一点,Selenium支持的Firefox浏览器安全性强,不允许跨域调用。
收藏
举报
TAG:
元素