2013-07-06 123 views
0

我正在使用Webdriver(沒有IEDriver實現)2.23在Windows7機器上使用JDK7和JRE7的API。測試腳本按預期正常工作,但是當我介紹IEDriver時,腳本在頁面中失敗,無法單擊元素錯誤消息,因爲相應的元素不可見。我已經與我的定位器應用程序進行了雙重檢查。 IEDriver的實現可以點擊相同。我嘗試了模擬所有的點擊類型,包括Action類的上下文點擊。沒用。所有點擊類型都會返回相同的結果。任何幫助?IEDriver實現未通過測試

+0

即使升級到最新版本也需要IEDriver實施。我正在努力。 driver.findElement(By.xpath(「xpath」))。click();是我的代碼 – Karthikeyan

+0

中的麻煩點嘗試使用SendKeys(Keys.ENTER),而不是click()方法。 –

+0

@Sri,我嘗試了所有這些,問題是元素本身不可見。這是奇特的。因爲沒有IEDriver,工作正常。另外,IEDriver的實施不會影響所有其他操作。只有這個特定元素是可訪問的。 – Karthikeyan

回答

0

最後,我設法在下面的代碼的幫助下點擊上述元素。

WebElement we = driver.findElement(By.name("Complete")); 
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript("arguments[0].click();", we); // common for all we 

真實來源是here。這可能對某人有幫助。

+0

它很好用,但代碼不是很乾淨。在我的情況下,IEDriver沒有問題點擊WebElement對象。我對可能發生的事情有一些想法,可能我們可以得到更好的解決方案。你能告訴我,如果直接運行'we.click()'會發生什麼情況。 –

+0

@塞爾吉奧佩林我同意。這對我來說也是特別的。因爲我可以用其他元素執行相同的(CLick)操作。這隻發生在這個元素上。我無法在此處上傳我的堆棧跟蹤。精確錯誤是:無法點擊該元素,因爲它不可見。 – Karthikeyan

+0

@ Karthikeyan好的。行動前還有兩個問題。 1:你周圍是否有新興元素?說「加載...」或類似的? 2:你可以在'we.click()'之前插入你的代碼,打印出下面的值'we.isDisplayed()'的行嗎?告訴我它是真的還是假的,接下來我們要解決它。 –

0

正如你所說元素實際上是可見的,並且錯誤的日誌表明它不是,我認爲這個問題可能是由於Internet Explorer的緩慢。您可以使用此方法快速測試:

boolean isElementDisplayed(final WebDriver driver, final WebElement element, final int timeoutInSeconds) { 
    try { 
     ExpectedCondition condition = new ExpectedCondition<Boolean>() { 
      @Override 
      public Boolean apply(final WebDriver webDriver) { 
       return element.isDisplayed(); 
      } 
     }; 

     Wait w = new WebDriverWait(driver, timeoutInSeconds); 
     w.until(condition); 
    } catch (Exception ex) { 
     //if you get here, it's because the element is not displayed after timeoutInSeconds 
     return false; 
    } 
    return true; 
} 

使用方法如下:

WebElement we = driver.findElement(By.name("Complete")); 

if (isElementDisplayed(driver, we, 30)) { 
    we.click(); 
} 

這將使司機等待(最長30秒),直到元我們變得可見和然後司機點擊它。 如果成功,那麼我的假設是正確的,你可以改變方法:

void clickOn(final WebDriver driver, final WebElement element, final int timeoutInSeconds) { 
    try { 
     ExpectedCondition condition = new ExpectedCondition<Boolean>() { 
      @Override 
      public Boolean apply(final WebDriver webDriver) { 
       element.click(); 
       return true; 
      } 
     }; 

     Wait w = new WebDriverWait(driver, timeoutInSeconds); 
     w.until(condition); 
    } catch (Exception ex) { 
     //probably some kind of exception thrown here 
    } 
    return; 
} 

,並用它來代替we.click(),如:

WebElement we = driver.findElement(By.name("Complete")); 
clickOn(driver, we, 30); 

上面的代碼是一個近似值,讓你快速清晰地檢查你的問題,如果你最終使用它,你應該適應你的代碼結構。這種實用程序代碼不應出現在您的測試中。您的測試代碼應該是乾淨的,並且對於所有環境(瀏覽器,版本,SO等)都是相同的。分開保存解決方法,例如某種util包。

此外,該方法的簽名是「超重」。重構你的util代碼,你應該能夠在你的測試中寫下如下:clickOn(element)

希望它幫助;)

UPDATE其實,這些組件我從來沒有碰到過類似的問題:

  1. selenium-server-standalone版本2.32.0
  2. IEDriverServer_x64_2.30.1.exe
+0

糟糕,'isElementDisplayed(driver,we,30)'在這裏始終是錯誤的。 (「完整」))。size());'(這個按鈕的大小是「+」driver.findElements(By.name(「Complete」))是1. – Karthikeyan

+0

@ Karthikeyan好的。恢復我們在這裏:1-代碼與其他瀏覽器一起工作(至少使用FF); 2 - 使用IE Selenium能夠找到該按鈕,但發現它不顯示(即不可點擊); 3-這個問題不是由於IE緩慢,因爲即使在30秒後按鈕仍然不顯示。你能做到以下幾點:1 - 改變按鈕的名稱不太常見的東西(例如'MySeleniumButton'),以確保Selenium找到這個而不是其他元素; 2-在IE中打開你的應用程序,確認你能夠點擊按鈕,然後複製併發布按鈕的HTML代碼。 –

+0

1.不與FF一起工作。 2.是的,它可以找到它。因此System.out.println(「按鈕的大小是」+ driver.findElements(By.name(「Complete」))。size());'是1. 現在我無法訪問AUT代碼。同樣的工作與硒2.23(與出IEDriver) – Karthikeyan