2010-07-19 16 views
34

परीक्षण है कि मैं लिख सकते हैं, अगर मैं एक WebElement बात पर जोर देना चाहते हैं के साथ सेलेनियम WebDriver का उपयोग कर पेश नहीं किया गया है पृष्ठ पर मौजूद है, मैं एक साधारण कर सकते हैं:का दावा है कि एक WebElement जावा

driver.findElement(By.linkText("Test Search")); 

यह पारित करेंगे यदि यह अस्तित्व में है और यदि यह अस्तित्व में नहीं है तो यह बमबारी करेगा। लेकिन अब मैं यह कहना चाहता हूं कि एक लिंक मौजूद नहीं है। मैं अस्पष्ट हूं कि यह कैसे करना है क्योंकि उपर्युक्त कोड एक बूलियन नहीं लौटाता है।

EDIT इस तरह मैं अपने स्वयं के फ़िक्स के साथ आया, मैं सोच रहा हूं कि अभी भी एक बेहतर तरीका है या नहीं।

public static void assertLinkNotPresent (WebDriver driver, String text) throws Exception { 
List<WebElement> bob = driver.findElements(By.linkText(text)); 
    if (bob.isEmpty() == false) { 
    throw new Exception (text + " (Link is present)"); 
    } 
} 

उत्तर

8

सुनिश्चित नहीं हैं कि सेलेनियम का संस्करण आप की बात कर रहे, * अब यह कर सकते हैं: http://release.seleniumhq.org/selenium-core/0.8.0/reference.html

  • assertNotSomethingSelected
  • assertTextNotPresent

आदि ..

+0

लिंक अब टूटा हुआ – Andrejs

+0

ओपी मूल समस्या यह इंगित करती है कि तत्व मौजूद नहीं होने पर अपवाद को फेंक दिया गया था। – DMart

12

मुझे लगता है कि तुम सिर्फ org.openqa.selenium.NoSuchElementException कि driver.findElement द्वारा फेंक दिया जाएगा पकड़ने ऐसी कोई तत्व मौजूद है या कर सकते हैं: हालांकि सेलेनियम में कुछ आदेश

import org.openqa.selenium.NoSuchElementException; 

.... 

public static void assertLinkNotPresent(WebDriver driver, String text) { 
    try { 
     driver.findElement(By.linkText(text)); 
     fail("Link with text <" + text + "> is present"); 
    } catch (NoSuchElementException ex) { 
     /* do nothing, link is not present, assert is passed */ 
    } 
} 
+0

अच्छा विचार। हालांकि अजीब बात यह है कि वेब ड्राइवर – DevDave

+1

में पहले से ही इस तरह के दावे से निपटने के लिए एक तंत्र नहीं है, ताकि यह और आनुवांशिक हो सके कि आप स्ट्रिंग टेक्स्ट के बजाय बाय.आईडी/सीएसएस चयनकर्ता आदि में जा सकें। – Dave

+1

खाली पकड़ ब्लॉक कभी भी एक अच्छा विचार नहीं है। – aimbire

1
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed(); 
assertFalse(titleTextfield, "Title text field present which is not expected"); 
2

इस प्रयास करें -

private boolean verifyElementAbsent(String locator) throws Exception { 
    try { 
     driver.findElement(By.xpath(locator)); 
     System.out.println("Element Present"); 
     return false; 

    } catch (NoSuchElementException e) { 
     System.out.println("Element absent"); 
     return true; 
    } 
} 
+0

मुझे संदेह है कि यह काम नहीं करेगा। मैं पर्ल बाइंडिंग का उपयोग करता हूं और इस दृष्टिकोण का उपयोग करने की कोशिश करता हूं और समस्या यह थी कि जब कोई तत्व नहीं मिला तो चालक का उदाहरण मर गया। सुनिश्चित नहीं है कि जावा के साथ ऐसा ही होता है। – user907860

-1

findElement html स्रोत की जाँच करेगा और सही वापस आ जाएगी, भले ही तत्व प्रदर्शित नहीं है। एक तत्व दिखाई दे या नहीं की जाँच करें या नहीं का उपयोग करने के लिए -

private boolean verifyElementAbsent(String locator) throws Exception { 

     boolean visible = driver.findElement(By.xpath(locator)).isDisplayed(); 
     boolean result = !visible; 
     System.out.println(result); 
     return result; 
} 
24

यह यह करने के लिए आसान है:

By loc = ... 
    Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver()); 
    Assert.assertTrue(notPresent); 
+0

धन्यवाद, गैर-जावा बाइंडिंग के लिए भी यह सबसे अच्छा तरीका प्रतीत होता है। – user907860

+1

यह निष्कर्ष निकाला गया अपवाद से बचने के लिए अब तक का बेहतर जवाब है। – DMart

6

एक क्लास ExpectedConditions कहा जाता है इसके लिए। तो अपने मामले के लिए उदाहरण हो सकता है

Graphene.element(By.linkText(text)).isPresent().apply(driver)); 

भी अजाक्स, धाराप्रवाह प्रतीक्षा करता है, पेज वस्तुओं, टुकड़े और इतने पर के साथ काम करने के लिए अच्छा एपीआई की आप गुच्छा प्रदान करता है। यह निश्चित रूप से सेलेनियम आधारित परीक्षण विकास को बहुत आसान बनाता है।

+0

किसी कारण से यह मेरे लिए काम नहीं करता है (कम से कम सेलेनियम '2.53.0' में)। इसके बजाय मुझे इस तरह के ** सभी ** तत्वों की उपस्थिति का उपयोग करना पड़ा: 'अपेक्षित कंडीशन.नॉट (अपेक्षित कंडिशन.presenceOfAllElementsLocatedBy (लोकेटर)); '। – stiemannkj1

0

आप Arquillian Graphene ढांचे utlilize कर सकते हैं:

driver.findElements(By.linkText("myLinkText")).size() < 1 
4
सेलेनियम Webdriver साथ

कुछ इस तरह होगा:

assertTrue(!isElementPresent(By.linkText("Empresas en Misión"))); 
0

Node.js के लिए मैंने पाया एक तत्व के लिए प्रतीक्षा करने के लिए नहीं रह गया उपस्थित होने का प्रभावी तरीका हो के लिए निम्न:

// variable to hold loop limit 
    var limit = 5; 
// variable to hold the loop count 
    var tries = 0; 
     var retry = driver.findElements(By.xpath(selector)); 
      while(retry.size > 0 && tries < limit){ 
       driver.sleep(timeout/10) 
       tries++; 
       retry = driver.findElements(By.xpath(selector)) 
      } 
एपियम 1.6 के लिए
+0

यदि तत्व – algot

+0

गायब नहीं होता है तो आप कोड अनंत लूप में आ सकते हैं। निश्चित है कि। मैं त्रुटि प्रबंधन जोड़ने के लिए नहीं जा रहा हूँ। – QualiT

-1

।0 और ऊपर

WebElement button = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//XCUIElementTypeButton[@name='your button']")))); 
    button.click(); 

    Assert.assertTrue(!button.isDisplayed()); 
1

ऐसा लगता है कि findElements() केवल जल्दी से वापस आती है अगर यह कम से कम एक तत्व पाता है। अन्यथा यह शून्य तत्वों को वापस करने से पहले, अंतर्निहित प्रतीक्षा टाइमआउट की प्रतीक्षा करता है - बस findElement() की तरह।

परीक्षण अच्छा की गति रखने के लिए, इस उदाहरण अस्थायी रूप से निहित इंतजार को भी कम करता तत्व गायब होने की प्रतीक्षा करते हुए:

static final int TIMEOUT = 10; 

public void checkGone(String id) { 
    FluentWait<WebDriver> wait = new WebDriverWait(driver, TIMEOUT) 
      .ignoring(StaleElementReferenceException.class); 

    driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); 
    try { 
     wait.until(ExpectedConditions.numberOfElementsToBe(By.id(id), 0)); 
    } finally { 
     resetTimeout(); 
    } 
} 

void resetTimeout() { 
    driver.manage().timeouts().implicitlyWait(TIMEOUT, TimeUnit.SECONDS); 
} 

फिर भी एक तरह से समय समाप्ति से बचने के लिए पूरी तरह से हालांकि की तलाश में ...

संबंधित मुद्दे

 संबंधित मुद्दे