2017-02-14 20 views
2

Ich bin neu Selenium WebDriver Tests und ich versuche es bei der Arbeit zu verwenden. Ich habe viele Kombinationen von Selektoren, XPaths usw. ausprobiert, aber ich kann nicht darüber hinausgehen. Ich habe auch viele ähnliche Themen auf Stackoverflow durchsucht, leider ohne vorhergesehene Ergebnisse. Was ich brauche, ist in der Lage zu sein, auf den "NO SERVICE" -Button (a href) zu klicken. Wenn ich es versuche, bekomme ich immer wieder den Fehler, dass dieses Element nicht sichtbar ist. Wenn ich versuche, diesen Fehler mit "Warten" zu behandeln, erhalte ich einen weiteren Fehler "Erwartete Bedingung fehlgeschlagen: Warten auf Sichtbarkeit des Elements ...". Was mache ich falsch?Selenium WebDriver Java - Element ist nicht sichtbar

Mein Code:

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

und auch ein HTML-Code-Schnipsel aus Homepage:

<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

Das Element, nach dem Sie suchen, ist in einer Eingabe enthalten, die "versteckt" ist, machen Sie etwas in Ihrem Test, damit die Eingabe nicht ausgeblendet wird? – Josh

+0

@Josh, nein, es ist kein Teil der versteckten "Eingabe". AFAIK, 'input' Element kann nur Attribute enthalten, aber keine anderen Knoten. – Andersson

Antwort

0

Ihre Locator By.className("withoutService") können mehrere Elemente entsprechen. Sie benötigen einen spezifischeren Selektor. Versuchen Sie unter Code:

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

Ich glaube nicht, dass die Fehler, die er empfängt, darauf hindeuten, dass es ein Problem mit mehreren Elementen gibt, die die Kriterien – Josh

+0

erfüllen. Entschuldigung, ich habe deine Antwort irrtümlich bearbeitet. Sie können es ablehnen, wenn Sie wollen –

+1

@Naveen, das ist in Ordnung :) Aber Sie sollten beachten, dass wenn Element in einem 'iframe', könnte man' NoSuchElementException', aber nicht 'ElementNotVisibleException' – Andersson

0

die folgende XPath Versuchen:

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

komplette Code:

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

Wenn obige Code nicht funktioniert, dann könnte das Element innerhalb eines iframe sein. bitte schauen Sie meine detaillierte Antwort here.

+1

Eigentlich ist 'ohneService' ein vollständiger Klassenname, der mit der Suche' By.className() 'verwendet werden kann. Ich denke, du verwechselst * komplette * und * zusammengesetzte * Klassennamen – Andersson

+0

Ja, mein Schlechter. Danke für das Aufzeigen. –

Verwandte Themen