2017-02-14 4 views
2

Я новичок в тестах Selenium WebDriver, и я стараюсь использовать его на работе. Я пробовал много комбинаций селекторов, xpath и т. Д., Но я не могу пройти мимо него. Я искал также много похожих тем в stackoverflow, к сожалению, без ожидаемых результатов. Мне нужно, чтобы можно было нажать кнопку «НЕТ СЕРВИС» (href). Когда я пытаюсь, я все время получаю ошибку, что этот элемент не отображается. Когда я пытаюсь обработать эту ошибку с помощью «wait» s, я продолжаю получать еще одну ошибку «Ожидаемое условие не удалось: ожидание видимости элемента ...». Что я делаю не так?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, нет, это не часть скрытого 'input'. 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

Да, мой плохой. Спасибо за указание. –