Webdriver定位不到元素的解决办法

不知道怎么回事,先前能跑动的case,现在元素始终找不到。

  但是我xpath是能定位得到的,debug了一下,结果发现在

  WebElementelement = locator.findElement();就卡住了。

  弄了好久也没有成功。

  网上找例子:

  Selenium2(WebDriver)_如何判断WebElement元素对象是否存在

  1.selenium中如果去寻找元素,而元素不存在的话,通常会抛出NoSuchElementException 导致测试失败,但有时候,我们需要去确保页面元素不存在,才是我们正确的验收条件下面的方法可以用来判定页面元素是否存在

    1 public boolean doesWebElementExist(WebDriver driver, By selector)

    2{

    3

    4         try

    5         {

    6                driver.findElement(selector);

    7                returntrue;

    8        }

    9        catch(NoSuchElementException e)

    10         {

    11                 return false;

    12         }

    13 }

  2.一般有这样的应用场合,例如我们要验证在一个网站是否登录成功,那么可以通过判断登录之后是否显示相应元素:

  WebElementlinkUsername =driver.findElement(By.xpath("//a[contains(text(),"+username+")]"));

  return linkUsername.isDisplayed();

  这一方法的前提是:该元素之前已经存在,仅仅需要判断是否被显示。

  现在存在另一种场合,页面元素并不存在,即通过driver.findElement只能在超时之后得到NoSuchElementException的异常。

  因此只好通过如下方法解决:


1 boolean ElementExist (ByLocator )

2{

3 try

4 {

5 driver.findElement( Locator );

6 returntrue;

7}

8 catch(org.openqa.selenium.NoSuchElementException ex)

9{

10     returnfalse;

11 }

12 }

  但这一方法仍然不理想,有这样两个问题:

  1、这一方法不属于任何一个page页,因此需要额外进行框架上的变更以支持这些功能函数,否则就必须在每一个用到该函数的page类写一遍。

  2、仍然需要等到超时才能得知结果,当需要频繁使用该函数的时候会造成相当的时间浪费。

  3.

  类似于seleniumRC中的isTextPresent方法

  用xpath匹配所有元素(//*[contains(.,'keyword')]),判断是否存在包含期望关键字的元素。

  使用时可以根据需要调整参数和返回值。


1 public boolean isContentAppeared(WebDriver driver,String content) {

2       booleanstatus = false;

3       try {

4          driver.findElement(By.xpath("//*[contains(.,'" + content +"')]"));

5           System.out.println(content + "is appeard!");

6           status = true;

7       } catch (NoSuchElementException e) {

8           status = false;

9           System.out.println("'" +content + "' doesn't exist!"));

10      }

11      return status;

12 }

  4. Xpath 多重判断

  1 while(currentPageLinkNumber<MaxPage)

  2 {

  3 WebElement PageLink;

  4 PageLink = driver.findElement(By.xpath("//a[@class = 'PageLink' and@title ='"+Integer.toString(currentPageLinkNumber+1)+"']"));

  5 PageLink.click();

  6 currentPageLinkNumber++;

  7 //OtherOperation();

  8 }

  然后又看了一篇文章

  selenium webdriver定位不到元素的五种原因及解决办法

  1.动态id定位不到元素

  for example:

  //WebElement xiexin_element = driver.findElement(By.id("_mail_component_82_82"));

  WebElement xiexin_element = driver.findElement(By.xpath("//span[contains(.,'写  信')]"));

  xiexin_element.click();

  上面一段代码注释掉的部分为通过id定位element的,但是此id“_mail_component_82_82”后面的数字会随着你每次登陆而变化,此时就无法通过id准确定位到element。

  所以推荐使用xpath的相对路径方法查找到该元素。

 2.iframe原因定位不到元素

  由于需要定位的元素在某一个frame里边,所以有时通过单独的id/name/xpath还是定位不到此元素

  比如以下一段xml源文件:


<iframe id="left_frame" scrolling="auto" frameborder="0" 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>

<head>

<body class="menuBg">

<div id="menu_node_type_0">

<table width="193" cellspacing="0" cellpadding="0" border="0">

<tbody>

<tr>

<tr>

<td id="c_1">

<table class="menuSub" cellspacing="0" cellpadding="0" border="0" align="center">

<tbody>

<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.不在同一个frame里边查找元素

  大家可能会遇到页面左边一栏属于left_frame,右侧属于right_frame的情况,此时如果当前处在

  left_frame,就无法通过id定位到right_frame的元素。此时需要通过以下语句切换到默认的content

  driver.switchTo().defaultContent();

  例如当前所在的frame为left_frame

  WebElement xiaoshoumingxi_element = driver.switchTo().frame("left_frame").findElement(By.linkText("销售明细"));

  xiaoshoumingxi_element.click();

  需要切换到right_frame

  driver.switchTo().defaultContent();

  Select quanzhong_select2 = new Select(driver.switchTo().frame("right_frame").findElement(By.id("coupon_type_str")));

  quanzhong_select2.selectByVisibleText("售后0小时");

  4.  xpath描述错误

  这个是因为在描述路径的时候没有按照xpath的规则来写 造成找不到元素的情况出现

  5.点击速度过快  页面没有加载出来就需要点击页面上的元素

  这个需要增加一定等待时间,显示等待时间可以通过WebDriverWait 和util来实现

  例如:

  //用WebDriverWait和until实现显示等待 等待欢迎页的图片出现再进行其他操作

  WebDriverWait wait = (new WebDriverWait(driver,10));

  wait.until(new ExpectedCondition<Boolean>(){

  public Boolean apply(WebDriver d){

  boolean loadcomplete = d.switchTo().frame("right_frame").findElement(By.xpath("//center/div[@class='welco']/img")).isDisplayed();

  return loadcomplete;

  }

  });

  也可以自己预估时间通过Thread.sleep(5000);//等待5秒 这个是强制线程休息

  6.firefox安全性强,不允许跨域调用出现报错

  错误描述:uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMNSHTMLDocument.execCommand]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location:

  解决办法:

  这是因为firefox安全性强,不允许跨域调用。

  Firefox 要取消XMLHttpRequest的跨域限制的话,第一

  是从 about:config 里设置 signed.applets.codebase_principal_support = true; (地址栏输入about:config 即可进行firefox设置)

  第二就是在open的代码函数前加入类似如下的代码: try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); } catch (e) { alert("Permission UniversalBrowserRead denied."); }

  最后看了乙醇的文章


import java.io.File;

importorg.openqa.selenium.By;

importorg.openqa.selenium.WebDriver;

importorg.openqa.selenium.chrome.ChromeDriver;

importorg.openqa.selenium.support.ui.ExpectedCondition;

importorg.openqa.selenium.support.ui.WebDriverWait;

public classButtonDropdown {

public static voidmain(String[] args) throws InterruptedException {

WebDriver dr = newChromeDriver();

File file = newFile("src/button_dropdown.html");

String filePath = "file:///" + file.getAbsolutePath();

System.out.printf("nowaccesss %s \n", filePath);

dr.get(filePath);

Thread.sleep(1000);

//      定位text是watir-webdriver的下拉菜单

//      首先显示下拉菜单

dr.findElement(By.linkText("Info")).click();

(newWebDriverWait(dr, 10)).until(new ExpectedCondition<Boolean>(){

public Booleanapply(WebDriver d){

returnd.findElement(By.className("dropdown-menu")).isDisplayed();

}

});

//      通过ul再层级定位

dr.findElement(By.className("dropdown-menu")).findElement(By.linkText("watir-webdriver")).click();

Thread.sleep(1000);

System.out.println("browser will be close");

dr.quit();

}

}

  然后我自己定位的。


public XiaoyuanactivityPage zipaixiuye(){

driver.navigate().refresh();

luntan.click();

WebDriverWrapper.waitPageLoad(driver,3);

(new WebDriverWait(driver, 10)).until(newExpectedCondition<Boolean>() {

public Boolean apply(WebDriverdriver){

returndriver.findElement(By.className("TFB_sub_li")).isDisplayed();

}

});

driver.findElement(By.className("TFB_sub_li")).findElement(By.linkText("自拍秀")).click();

returnPageFactory.initElements(this.getDriver(),

XiaoyuanactivityPage.class);

}

  总算成功了,成功来得真不容易啊!

  我现在还是不明白我之前的方法为什么开始可以,后面就不行了。

  但是我现在也不去探究了,我自己的问题已经解决了。

  谢谢分享文章的朋友。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-07 23:02:57

Webdriver定位不到元素的解决办法的相关文章

IE6中Select覆盖DIV元素各种解决办法

普通的元素,textbox, div, table--这些,属于windowless element,它们之间互相遮盖的情况由z-index决定,在它们之上,是SELECT这些windowed element.所以一般情况下div.table等不能遮盖select. 解决办法一:Iframe包裹select元素  代码如下 复制代码 <iframe style="z-index:1" style="z-index:1"><!-- 用iframe 解

Selenium定位不到元素的解决方法—iframe挡住了去路

刚接触Selenium,在调试过程中发现有些元素定位不到,于是求助了百度,查找到的资料是这么说的:如果需要定位的元素在某个frame里,则单独通过id/name/xpath是定位不到此元素的.比如,原本想通过WebElement element=driver.FindElement(By.LinkText("XXX"));来定位元素的,但由于该元素在iframe. id="left_frame"这个frame里面,所以需要先定位frame,WebElement el

Selenium2(webdriver)_定位不到元素常见原因及解决办法

在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况,一般可以从以下几个方面着手解决: 1.Frame/Iframe原因定位不到元素: 这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位.   2.Xpath描述错误原因: 这种情况有可能是: 1.xpath语法规则书写错误,这个木有办法,补下xpath的语法,多写写,练

ie6 position约对定位错位解决办法

ie6绝对定位的bug及其解决办法.position:absolute定位在ie6下存在left和bottom的定位错误问题 ie6中很多bug都可以通过触发layout得到解决,以上的解决方法无论是设置zoom:1还是设置width和height其实都是为了触发layout.下列的css教程属性或取值会让一个元素获得layout:        position:absolute 绝对定位元素的包含区块(containing block)就会经常在这一方面出问题 float:left|righ

无法定位程序输入点 msvcr100.dll的解决办法

无法定位程序输入点 msvcr100.dll的原因:用户在安装运行游戏模拟器时,由于缺少程序语言编译环境(VC2010运行库),造成游戏模拟器或其他软件无法进行程序 编译调试,系统将提示"出现无法定位程序输入点×××于动态链接库msvcr100.dll上"或提示"没有找到msvcr100.dll,因此这个程序 未能启动...": 无法定位程序输入点 msvcr100.dll的解决办法: 下载安装Microsoft Visual C++ 2010(VC2010运行库)

connect-ios地图定位时出现这个错误,之前还能用,请各位大牛帮忙提供一下解决办法

问题描述 ios地图定位时出现这个错误,之前还能用,请各位大牛帮忙提供一下解决办法 PBRequester failed with Error Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo=0x7f93be943480 {NSUnderlyingError=0x7f93bea16b10 "Could not connect to the server.&

jQuery on()方法绑定动态元素的点击事件无响应的解决办法_jquery

$('#check_all').on('click' , function(){ alert(1); }); $("#yujinlist").append(html); count++; } 以上代码执行时,点击#check_all时,alert一直没反应,后在网上查资料时,才知道on前面的元素也必须在页面加载的时候就存在于dom里面, 那原话是这样的: 支持给动态元素和属性绑定事件的是live和on,其中live在JQUERY 1.7之后就不推荐使用了.现在主要用on,使用on的时候

js鼠标滑过弹出层的定位IE6bug解决办法_javascript技巧

大家在写div+css的时候经常会用到弹出层,由于IE6的bug,所以当使用多个标签重复写弹出层的时候会遇到后面的层压在了弹出层的上面,这种问题在火狐浏览器下可以用z-index来解决,但是在IE6下面是不起作用的,下面的代码给大家提供了一种此类问题的解决办法,原理如下:用Jquery给弹出层的z轴依次增加高度.代码很简单,效果很显著,吼吼! 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q

网页中实现套打的解决办法

解决|网页 <% rem 文章标题:关于网页中实现套打的解决办法 rem 作者:yanek rem 联系:aspboy@263.net %> 1.制作一个简单网页,其中只包含一个元素.. 如:几个字,并设置其位置为坐标原点O(0mm,0mm),以mm为单位. <DIV STYLE="position: absolute; top: 0mm; left: 0mm; width: 120px; font: 9pt 宋体; color: #000020">中文天地&l