2014-02-07 91 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(); 
     } 
    } 
}