2014-02-07 93 views
0

按照相同的元素能正常工作在IE中,FF它给ElementNotVisibleException硒的webdriver点击在FF和IE

driver.findElement(By.xpath("//div[4]/table/tbody/tr[1]/td[2]")).click(); 

虽然按照FF作品,也就是说,它并不做任何事情:

WebElement element1 = driver.findElement(By.xpath("//div[4]/table/tbody/tr[1]/td[2]")); 
((JavascriptExecutor) driver).executeScript("arguments[0].click();", element1); 

我使用IE 9.0(使用32位IEDriverServe.exe)和FF 23.0

这里是代码:

<div id="popup_12" class="dijitPopup dijitMenuPopup" style="z-index: 1000; right: auto; left: 45px; top: 27px; visibility: visible; display: none;" role="presentation" dijitpopupparent="dijit_MenuBar_0"> 
<table class="dijit dijitMenu dijitReset dijitMenuTable dijitMenuPassive" cellspacing="0" data-dojo-attach-event="onkeypress:_onKeyPress" tabindex="0" role="menu" widgetid="dijit_Menu_1" style="top: 0px; visibility: visible;"> 
    <tbody class="dijitReset" data-dojo-attach-point="containerNode"> 
    <tr class="dijitReset dijitMenuItem" tabindex="-1" role="menuitem" data-dojo-attach-point="focusNode" aria-labelledby="dijit_PopupMenuItem_1_text dijit_PopupMenuItem_1_accel" style="-moz-user-select: none;" widgetid="dijit_PopupMenuItem_1" aria-haspopup="true"> 
     <td class="dijitReset dijitMenuItemIconCell" role="presentation"> 
     <td id="dijit_PopupMenuItem_1_text" class="dijitReset dijitMenuItemLabel" data-dojo-attach-point="containerNode" colspan="2">XXXXX</td> 






<div id="popup_23" class="dijitPopup dijitMenuPopup" style="z-index: 1001; right: auto; left: 117px; top: 0px; visibility: visible; display: none;" role="presentation" dijitpopupparent="dijit_Menu_1"> 
    <table class="dijit dijitMenu dijitReset dijitMenuTable dijitMenuPassive" cellspacing="0" data-dojo-attach-event="onkeypress:_onKeyPress" tabindex="0" role="menu" widgetid="dijit_Menu_2" style="top: 0px; visibility: visible;"> 
    <tbody class="dijitReset" data-dojo-attach-point="containerNode"> 
     <tr class="dijitReset dijitMenuItem" tabindex="-1" role="menuitem" data-dojo-attach-point="focusNode" aria-labelledby="dijit_MenuItem_3_text dijit_MenuItem_3_accel" style="-moz-user-select: none;" widgetid="dijit_MenuItem_3"> 
     <tr class="dijitReset dijitMenuItem" tabindex="-1" role="menuitem" data-dojo-attach-point="focusNode" aria-labelledby="dijit_MenuItem_4_text dijit_MenuItem_4_accel" style="-moz-user-select: none;" widgetid="dijit_MenuItem_4"> 
     <tr class="dijitMenuSeparator" style="-moz-user-select: none;" widgetid="dijit_MenuSeparator_0"> 
     <tr class="dijitReset dijitMenuItem" tabindex="-1" role="menuitem" data-dojo-attach-point="focusNode" aria-labelledby="dijit_MenuItem_5_text dijit_MenuItem_5_accel" style="-moz-user-select: none;" widgetid="dijit_MenuItem_5"> 
       <td class="dijitReset dijitMenuItemIconCell" role="presentation"> 
       <td id="dijit_MenuItem_5_text" class="dijitReset dijitMenuItemLabel" data-dojo-attach-point="containerNode" colspan="2">YYYYY</td> 

我必须单击项目XXXXX和项目YYYYY

与popup_12和popup_23 DIV ID改变每次页面加载时间或点击该项目

项目YYYYY仅在项目XXXXX被点击时才会显示

使用javascript执行程序和xpath或CSS选择器的FF可以很好地工作,但是与也就是说,它并不

对于这个与IE浏览器工作,我必须使用XPath或CSS无javascript执行,但这次又不会与FF

回答

0

XXXXX和YYYYY

int no_of_popups = driver.findElements(By.cssSelector("div[id*='popup']")).size(); 

for(int i=1;i<=no_of_popups;i++) 

{ 

String text = driver.findElement(By.cssSelector("div.dijitPopup:nth-of-type("+i+ 
") > table.dijitReset > tbody.dijitReset > tr.dijitMenuItem > td.dijitMenuItemLabel")).getText(); 

    S.O.P(text); 

} 
0

的作品,您可以随时查看是否显示元素(可见,不只是在DOM)

el = driver.find_element(:xpath, 'xpath').displayed? 
el.click 
0

我们测试的网站成千上万这样做时,我有时会跨越硒/ webdriver的内类似的限制来。 XPath非常强大,我们每天都使用它,但假设页面使用JQuery,则可以使用JQuery Selector完成DOM的全部搜索,然后不必担心元素是否可见。

的代码可能看起来是这样的: driver.executeScript("$('td:contains(\"Foo\")').click();");

我不建议走DOM你有办法,有更有效的是找到你在找什么。然而,基于你的上面,你可以做这样的事情: driver.executeScript("$($($($('body').find('div')[4]).find('table:first').find('tbody:first').find('tr')[1]).find('td')[2]).click();");

你可以阅读更多关于他们的webpage jQuery选择器。

使用Neustar本地验证器可轻松编写用于功能测试的脚本。您可以查看示例并观看有关如何执行此操作的视频:http://community.neustar.biz/community/wpm/getting_started/blog/2013/11/20/neustar-training-videos

祝您好运。
布赖恩Kranson
:Neustar公司/专业服务工程师

+0

我对硒的经验,但是我发现你在宣传你的产品时很奇怪(因为我不能说它对这个问题有用)。知道它已经被讨论过了:http:// meta。stackexchange.com/questions/57497/limits-for-self-promotion-in-answers。 –

+0

Marc,感谢您强调代码,我原本应该这样做。另外感谢您将链接添加到jQuery。我理解你对促销链接的观点,然而本地验证器使得用Selenium进行功能测试变得更容易。希望我在几年前知道这件事时就开始做这件事。它是免费的。我非常理解你的观点,所以我删除了链接到我们的网页,并严格保持链接关于如何使用本地验证器,我认为这对海报很有用。 –

+0

编辑没问题,这是正常的事情。随着你的编辑,如果你的答案可以帮助你的答案,我没有看到问题,那正是我们想要的。 –

0

您可以使用WAITTIME或等待元素如下

int timeout=1; 
while(timeout<=60) 
{ 
    WebElement element1 = driver.findElement(By.xpath("//div[4]/table/tbody/tr[1]/td[2]")); 

    if(element1.isDisplayed()) 
    { 
     ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element1); 
     break; 
    } 
    else 
    { 
     try { 
      Thread.sleep(2000); 
      timeout++; 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}