2017-02-14 110 views
2

我是Selenium WebDriver測試的新手,我嘗試在工作中使用它。我嘗試了許多選擇器,xpaths等的組合,但我無法移過它。我也在stackoverflow上搜索了很多類似的主題,可惜沒有預期的結果。我需要的是能夠點擊「無服務」按鈕(一個href)。當我嘗試時,我不斷收到錯誤,說明此元素不可見。當我嘗試使用「等待」處理此錯誤時,我不斷收到另一個錯誤「預期的條件失敗:等待元素的可見性...」。我究竟做錯了什麼?Selenium WebDriver Java - 元素不可見

我的代碼:

WebDriverWait waitWait = new WebDriverWait(driver, 40);  
    waitWait.until(ExpectedConditions.visibilityOfElementLocated(By.className("withoutService")));  
    WebElement x = driver.findElement(By.className("withoutService")); 
    x.click(); 

,也是一個HTML代碼片段從網頁:

<div id="fancybox-outer"> 
    <div id="fancybox-content"> 
     <div style="width:auto;position:relative;"> 
      <div id="serviceReminder" style="width: 765px"> 
       <form id="serviceReminderFrom" method="post"> 
        <div class="homeMessage"> 
         <div class="innerMessage"> 
          <input type="hidden" id="serviceToAddReminderFromAction" name="F_ACTION" value=""> 
          <input type="hidden" id="itemsWithServices" name="itemsWithServices" value=""> 
          <input type="hidden" name="eventTypeName" value="Something"> 
           <div class="ServicesDelivery"><span class="disable-button"></span> 
            <a href="javaScript:void(0);" rel="3" class="withoutService btn btn-fourth" onclick="registerButtonClickOnPopup('NO SERVICE'); setTimeout(function(){registerButtonClickOnPopup('NO SERVICE');},400);">NO SERVICE</a> 
            <a href="javascript:void(0)" rel="1" class="next js-tooltip btn btn-second" onclick="registerButtonClickOnPopup('ADD SERVICE'); setTimeout(function(){registerButtonClickOnPopup('ADD SERVICE');},400);">ADD SERVICE</a> 
          <div class="none"> 
          </div> 
          <div class="clear"></div> 
         </div> 
        </div> 
       </div> 
      </form> 
     </div></div></div><a id="fancybox-close" style="display: inline;"></a><div id="fancybox-title" class="" style="display: none;"> 
     </div><a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a><a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a></div> 
+0

你正在尋找的元素包含在「隱藏」的輸入內,你在測試中做了些什麼來使輸入不被隱藏? – Josh

+0

@Josh,不,它不是隱藏的「輸入」的一部分。 AFAIK,'input'元素只能包含屬性,而不能包含其他節點。 – Andersson

回答

0

你的定位By.className("withoutService")可以匹配多種元素。你需要更具體的選擇器。嘗試下面的代碼:

WebDriverWait waitWait = new WebDriverWait(driver, 40);  
WebElement x = waitWait.until(ExpectedConditions.elementToBeClickable(By.linkText("NO SERVICE")));  
x.click(); 
+0

我不認爲他收到的錯誤表明這是一個問題,滿足條件 – Josh

+0

多個元素對不起,我錯誤地編輯了你的答案。你可以拒絕它,如果你想 –

+1

@Naveen,沒關係:)但是你應該注意到,如果元素位於'iframe'內,可能會得到'NoSuchElementException',但不是'ElementNotVisibleException' – Andersson

0

嘗試以下XPath:

//a[contains(@class, 'withoutService')] 

完整代碼:

WebDriverWait waitWait = new WebDriverWait(driver, 40);  
WebElement x = waitWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(@class, 'withoutService')]")));  
x.click(); 

如果上面的代碼不能正常工作,則該元素可能是一個iframe內。請看我的詳細回答here

+1

實際上'withoutService'是完整的類名,可以與搜索'By.className()'一起使用。我認爲,你混淆*完整*和*化合物*類名 – Andersson

+0

是的,我的壞。感謝您指出。 –

相關問題