यदि तत्व सेलेनियम वेबड्राइवर का उपयोग करके मौजूद है तो टेस्ट करें?


163

अगर कोई तत्व मौजूद है तो परीक्षण कैसे किया जाए? कोई भी खोज विधि एक अपवाद में समाप्त हो जाती है, लेकिन यह वह नहीं है जो मैं चाहता हूं, क्योंकि यह हो सकता है कि कोई तत्व मौजूद नहीं है और यह ठीक है, यह परीक्षण की विफलता नहीं है, इसलिए एक अपवाद समाधान नहीं हो सकता है।

मुझे यह पोस्ट मिली है: सेलेनियम c # वेबड्राइवर: रुको जब तक तत्व मौजूद नहीं है लेकिन यह C # के लिए है और मैं इसमें बहुत अच्छा नहीं हूं। क्या कोई जावा में कोड का अनुवाद कर सकता है? मुझे खेद है दोस्तों, मैंने एक्लिप्स में इसे आज़माया था लेकिन मुझे यह जावा कोड में नहीं आता।

यह कोड है:

public static class WebDriverExtensions{
    public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){

        if (timeoutInSeconds > 0){
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }

        return driver.FindElement(by);
    }
}

मेरे पास कुछ तरीके हैं जो किसी वस्तु की जांच के लिए बहुत प्रभावी ढंग से काम करते हैं लेकिन यह इस बात पर निर्भर करता है कि आप इसके साथ क्या करना चाहते हैं। उदाहरण के लिए क्या आप तत्व को तब तक देखना चाहते हैं जब तक वह मौजूद न हो, क्या आप तब तक उसकी तलाश करना चाहते हैं जब तक वह मौजूद नहीं है या क्या आप उसे खोजने की कोशिश करना चाहते हैं?
CBRRacer

1
जावा C # के समान है, मुझे लगता है कि मुख्य समस्याओं में से एक आप यहाँ चल रहे हैं जावा में यह है IWebElement के बजाय WebElement
CBRRacer

क्या आप निहित प्रतीक्षा पद्धति के बारे में जानते हैं? परीक्षण की शुरुआत में इसे स्थापित करने से आपको कभी किसी तत्व के अस्तित्व की जांच करने की आवश्यकता नहीं होती है क्योंकि यह चुनाव के लिए निहित प्रतीक्षा मूल्य का उपयोग करता है, हालांकि अगर यह उस मूल्य से अधिक है तो यह एक अपवाद फेंक देगा
बॉब इवांस

यहाँ जावा में WebDriverWait के बारे में मेरी पोस्ट है: WebDriverWait

यदि दोनों में से कोई भी मामला ठीक है, तो यह परीक्षण प्रदर्शन के लिए समस्याग्रस्त हो सकता है, क्योंकि किसी तत्व की प्रतीक्षा करने से संबंधित प्रतीक्षा समय जो आपको वास्तव में मौजूद होने की उम्मीद नहीं करता है। मैंने प्रतीक्षा समय के आसपास पाने के लिए कुछ हैक का उपयोग किया है, लेकिन अभी तक इसके लिए वास्तव में साफ समाधान नहीं मिल पाया है।
mrfreester

जवाबों:


277

के findElementsबजाय का उपयोग करें findElement

findElements यदि कोई मेल खाने वाले तत्व अपवाद के बजाय नहीं मिलते हैं तो एक खाली सूची लौटाएंगे।

यह जाँचने के लिए कि कोई तत्व मौजूद है, आप यह कोशिश कर सकते हैं

Boolean isPresent = driver.findElements(By.yourLocator).size() > 0

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

आधिकारिक प्रलेखन इस विधि की सिफारिश करता है:

गैर-मौजूद तत्वों को देखने के लिए findElement का उपयोग नहीं किया जाना चाहिए, findElements (By) का उपयोग करें और इसके बजाय शून्य लंबाई प्रतिक्रिया का जोर दें।


32
यह आपके परीक्षणों को चलाने में बहुत समय लगाएगा। आप हर जगह इस तकनीक का उपयोग नहीं कर सकते।
दरोगांस

8
@ ड्रोगन - मैं आपके परीक्षणों में समय नहीं जोड़ूंगा। इसका कारण यह नहीं है क्योंकि डिफ़ॉल्ट अंतर्निहित प्रतीक्षा अभी भी 0. है। यदि आपने डिफ़ॉल्ट अंतर्निहित प्रतीक्षा में वृद्धि की है, तो मैं सहमत हूं कि यह होगा, लेकिन यह यहां मामला प्रतीत नहीं होता है।
djangofan

1
अच्छी कॉल djangofan! मैंने ड्राइवर टाइमआउट के निहितार्थ को शून्य में बदलकर इस रणनीति का सफलतापूर्वक उपयोग किया, फिर इसे अपने पिछले मूल्य में बदल दिया।
एमरी

3
इसने एक NoSuchElementFound अपवाद दिया, जो एक शर्म की बात है क्योंकि मैं एक अपवाद में उस अपवाद को पकड़ने से बचने के लिए इसका उपयोग करने की उम्मीद कर रहा था।

1
उपयोग करने के लिए बहुत आसान तरीका है: यदि (driver.getPageSource ()। में शामिल है ("पृष्ठ में एक पाठ")))}} यदि पृष्ठ में यह पाठ है तो स्थिति सही होगी, अन्यथा यह गलत होगा और आप कोड कर सकते हैं तदनुसार।
प्रद्योत

56

एक निजी विधि के बारे में क्या है जो बस तत्व को देखता है और निर्धारित करता है कि क्या यह इस तरह मौजूद है:

private boolean existsElement(String id) {
    try {
        driver.findElement(By.id(id));
    } catch (NoSuchElementException e) {
        return false;
    }
    return true;
}

यह काफी आसान होगा और काम करता है।

संपादित करें: आप आगे भी जा सकते हैं और By elementLocatorपैरामीटर के रूप में ले सकते हैं , यदि आप आईडी के अलावा किसी और चीज से तत्व को ढूंढना चाहते हैं तो समस्याओं को समाप्त कर सकते हैं।


3
हाँ, यह जाने का रास्ता है। समझ में नहीं आ रहा है कि लोग इस तरह से अनदेखी क्यों कर रहे हैं, और मिलान वाले तत्वों की गिनती कर रहे हैं, यह देखने के लिए कि परिणाम 0. है
राल्फ लावेल

45
वैसे, मुझे यह कहना चाहिए कि प्रोग्राम के प्रवाह को विनियमित करने के लिए अपवाद का उपयोग करना सबसे अच्छा तरीका नहीं है।
डेनिस

2
है ना? यह आपका सुझाव था! यह एक अच्छा तरीका है अगर आपका परीक्षण तत्व को खोजने की उम्मीद नहीं करता है। जैसा कि आप दिखाते हैं, बस शून्य और assert.isnull या isnotnull लौटें, जो कि यदि कोई चीज़ मौजूद है, तो परीक्षण करने का एक सार्थक तरीका है।
राल्फ लावेल

2
मामले में मैंने इस सवाल का गलत अर्थ लगाया कि "क्या कोई तरीका है कि अगर कोई तत्व मौजूद है तो कैसे परीक्षण किया जाए?" गलत, मुझे यह जानकर प्रसन्नता होगी कि आपकी राय इस बात पर अलग है कि यह एक वैध उत्तर है या नहीं।
डेनिस

प्रतीक्षा समय को कम करना चाह सकते हैं। ठीक है, अगर तत्व मौजूद नहीं है, तो आपको "30 सेकंड" प्रतीक्षा करनी चाहिए इससे पहले कि फ़ंक्शन झूठी हो जाए
जेसन स्माइली

14

मैंने पाया कि यह जावा के लिए काम करता है:

WebDriverWait waiter = new WebDriverWait(driver, 5000);
waiter.until( ExpectedConditions.presenceOfElementLocated(by) );
driver.FindElement(by);

18
presenceOfElementLocatedयदि किसी विशेष प्रयास पर तत्व नहीं मिला है तो एक अपवाद को फेंक देंगे। इससे बचने के लिए, wait.ignoring(NoSuchElementException.class);पहली और दूसरी पंक्ति के बीच एक बयान जोड़ें ।
स्टीव चेम्बर्स

8
public static WebElement FindElement(WebDriver driver, By by, int timeoutInSeconds)
{
    WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds);
    wait.until( ExpectedConditions.presenceOfElementLocated(by) ); //throws a timeout exception if element not present after waiting <timeoutInSeconds> seconds
    return driver.findElement(by);
}

5

मेरी भी यही समस्या थी। मेरे लिए, उपयोगकर्ता के अनुमति स्तर के आधार पर, कुछ लिंक, बटन और अन्य तत्व पृष्ठ पर नहीं दिखाए जाएंगे। मेरे सूट का एक हिस्सा परीक्षण कर रहा था कि जिन तत्वों को गायब किया जाना चाहिए, वे गायब हैं। मैंने घंटों यह जानने की कोशिश की। मुझे आखिरकार सही समाधान मिल गया।

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

यह अंदर है C#, इसलिए अनुवाद करने की आवश्यकता होगी Java। लेकिन बहुत कठिन नहीं होना चाहिए।

public void verifyPermission(string link)
{
    IList<IWebElement> adminPermissions = driver.FindElements(By.CssSelector(link));
    if (adminPermissions.Count == 0)
    {
        Console.WriteLine("User's permission properly hidden");
    }
}

वहाँ भी एक और रास्ता आप अपने परीक्षण के लिए की जरूरत पर निर्भर करता है ले सकते हैं।

निम्नलिखित स्निपेट यह देखने के लिए जाँच कर रहा है कि क्या पृष्ठ पर एक बहुत विशिष्ट तत्व मौजूद है। तत्व के अस्तित्व पर निर्भर करता है कि मेरे पास परीक्षण एक और है।

यदि तत्व मौजूद है और पृष्ठ पर प्रदर्शित होता है, तो console.writeमुझे पता है और मुझे आगे बढ़ना है। यदि प्रश्न में तत्व मौजूद है, तो मैं अपनी ज़रूरत के परीक्षण का निष्पादन नहीं कर सकता, जो इसे स्थापित करने की आवश्यकता के पीछे मुख्य तर्क है।

यदि तत्व मौजूद नहीं है, और पृष्ठ पर प्रदर्शित नहीं होता है। मैं अगर परीक्षण को निष्पादित करने में दूसरा है।

IList<IWebElement> deviceNotFound = driver.FindElements(By.CssSelector("CSS LINK GOES HERE"));
//if the element specified above results in more than 0 elements and is displayed on page execute the following, otherwise execute whats in the else statement
if (deviceNotFound.Count > 0 && deviceNotFound[0].Displayed){
    //script to execute if element is found
} else {
    //Test script goes here.
}

मुझे पता है कि ओपी की प्रतिक्रिया पर मुझे थोड़ी देर हो गई है। उम्मीद है कि यह किसी की मदद करता है!


5

इसे आज़माएँ: इस पद्धति को कॉल करें और 3 तर्क पास करें:

  1. वेबड्राइवर चर। // संभालने वाले ड्राइवर के रूप में।
  2. वह तत्व जिसकी आप जाँच करने जा रहे हैं। बाय विधि से प्रदान करना चाहिए। // ex: By.id ("id")
  3. सेकंड में समय सीमा।

उदाहरण: WaitForElementPresent (ड्राइवर, By.id ("id"), 10);

public static WebElement waitForElementPresent(WebDriver driver, final By by, int timeOutInSeconds) {

        WebElement element; 

        try{
            driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() 

            WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); 
            element = wait.until(ExpectedConditions.presenceOfElementLocated(by));

            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //reset implicitlyWait
            return element; //return the element
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return null; 
    }

3

आप अपने ट्रायल कैच स्टेटमेंट से पहले सेलेनियम टाइमआउट को छोटा करके कोड को तेजी से चला सकते हैं।

एक तत्व मौजूद है या नहीं यह जांचने के लिए मैं निम्नलिखित कोड का उपयोग करता हूं।

protected boolean isElementPresent(By selector) {
    selenium.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
    logger.debug("Is element present"+selector);
    boolean returnVal = true;
    try{
        selenium.findElement(selector);
    } catch (NoSuchElementException e){
        returnVal = false;
    } finally {
        selenium.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    }
    return returnVal;
}

यह मैं अपने कोड में उपयोग करता हूं। मैं डिफ़ॉल्ट पर सेलेनियम टाइमआउट छोड़ देता हूं और फिर इसका उपयोग करता हूं।
निकोलस डिपियाज़ा

2
इस उत्तर को लिखने के बाद से मुझे पता चला कि ExpectedConditions का उपयोग करना बेहतर रूप माना जाता है, लेकिन एक तत्व मौजूद नहीं है, यह निर्धारित करने का प्रयास करते समय ट्राइ कैच स्टेटमेंट का उपयोग करना अभी भी उपयोगी है।
EsotericNonsense

मैं सेलेनियम के पुराने संस्करण पर अटका हुआ हूं क्योंकि मुझे IE8 का परीक्षण करना है। लेकिन मैं कोशिश करूंगा कि जब मैं अपग्रेड कर
सकूं

हर बार जब आपका तरीका निहित प्रतीक्षा टाइमआउट सेट करेगा, लेकिन तार्किक रूप से हमें ड्राइवर ऑब्जेक्ट को इनिशियलाइज़ करने के बाद केवल एक बार प्रतीक्षा करना चाहिए।
शेखर स्वामी

3

जावा का उपयोग करते हुए निम्नलिखित फ़ंक्शन / मेथोस लिखें:

protected boolean isElementPresent(By by){
        try{
            driver.findElement(by);
            return true;
        }
        catch(NoSuchElementException e){
            return false;
        }
    }

दावे के दौरान उपयुक्त पैरामीटर के साथ विधि को बुलाओ।


2

यदि आप रूबी में rspec-Webdriver का उपयोग कर रहे हैं, तो आप यह मानकर इस स्क्रिप्ट का उपयोग कर सकते हैं कि कोई तत्व वास्तव में मौजूद नहीं होना चाहिए और यह एक उत्तीर्ण परीक्षा है।

सबसे पहले, इस विधि को अपनी कक्षा आरबी फ़ाइल से पहले लिखें

class Test
 def element_present?
    begin
        browser.find_element(:name, "this_element_id".displayed?
        rescue Selenium::WebDriver::Error::NoSuchElementError
            puts "this element should not be present"
        end
 end

फिर, अपनी कल्पना फ़ाइल पर, उस पद्धति को कॉल करें।

  before(:all) do    
    @Test= Test.new(@browser)
  end

 @Test.element_present?.should == nil

यदि आपका तत्व मौजूद नहीं है, तो आपका कल्पना पास हो जाएगा, लेकिन यदि तत्व मौजूद है, तो यह एक त्रुटि फेंक देगा, परीक्षण विफल हो गया।


2

यह मेरे लिए काम करता है:

 if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){
    //THEN CLICK ON THE SUBMIT BUTTON
}else{
    //DO SOMETHING ELSE AS SUBMIT BUTTON IS NOT THERE
}

वही समस्या यहाँ मौजूद है: क्या होगा यदि तत्व "// * [@ id = 'सबमिट']" मौजूद नहीं है? फिर एक अपवाद फेंका जाएगा, इस प्रकार यदि सशर्त कभी मूल्यांकन नहीं करता है
MrBCut


1

व्यक्तिगत रूप से, मैं हमेशा उपरोक्त उत्तरों के मिश्रण के लिए जाता हूं और size() > 0सुझाव का उपयोग करने वाली पुन: प्रयोज्य स्थैतिक उपयोगिता विधि बनाता हूं :

public Class Utility {
   ...
   public static boolean isElementExist(WebDriver driver, By by) {
      return driver.findElements(by).size() > 0;
   ...
}

यह साफ-सुथरा है, फिर से उपयोग करने योग्य, बनाए रखने योग्य ... यह सब अच्छा सामान; ;-)


0

किसी विशेष तत्व को खोजने के लिए तत्व मौजूद है या नहीं, हमें findElement () के बजाय findElements () विधि का उपयोग करना होगा।

int i=driver.findElements(By.xpath(".......")).size();
if(i=0)
System.out.println("Element is not present");
else
System.out.println("Element is present");

यह मेरे लिए काम किया है .. मुझे सुझाव है कि अगर मैं गलत हूँ ..



0

कोड का मेरा स्निपेट देना। इसलिए, नीचे दी गई विधि यह जांचती है कि एक यादृच्छिक वेब तत्व ' नया एप्लिकेशन बनाएँ ' बटन एक पृष्ठ पर मौजूद है या नहीं। ध्यान दें कि मैंने प्रतीक्षा अवधि का उपयोग 0 सेकंड के रूप में किया है।

public boolean isCreateNewApplicationButtonVisible(){
    WebDriverWait zeroWait = new WebDriverWait(driver, 0);
    ExpectedCondition<WebElement> c = ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@value='Create New Application']"));
    try {
        zeroWait.until(c);
        logger.debug("Create New Application button is visible");
        return true;
    } catch (TimeoutException e) {
        logger.debug("Create New Application button is not visible");
        return false;
    }
}

0

मैं कुछ का उपयोग करूंगा जैसे कि स्काला (पुराने "अच्छे" जावा 8 में कोड इस के समान हो सकता है]):

object SeleniumFacade {

  def getElement(bySelector: By, maybeParent: Option[WebElement] = None, withIndex: Int = 0)(implicit driver: RemoteWebDriver): Option[WebElement] = {
    val elements = maybeParent match {
      case Some(parent) => parent.findElements(bySelector).asScala
      case None => driver.findElements(bySelector).asScala
    }
    if (elements.nonEmpty) {
      Try { Some(elements(withIndex)) } getOrElse None
    } else None
  }
  ...
}

तो फिर,

val maybeHeaderLink = SeleniumFacade getElement(By.xpath(".//a"), Some(someParentElement))

0

जावा में सबसे सरल तरीका है:

List<WebElement> linkSearch=  driver.findElements(By.id("linkTag"));
int checkLink=linkSearch.size();
if(checkLink!=0){  //do something you want}

0

आप अंतर्निहित प्रतीक्षा की कोशिश कर सकते हैं:

WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));

या आप स्पष्ट प्रतीक्षा करने का प्रयास कर सकते हैं:

IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("someDynamicElement"));
    });

स्पष्ट जांच करेगा कि क्या तत्व कुछ कार्रवाई से पहले मौजूद है। कोड में हर जगह इंप्लिकेंट वेट कॉल किया जा सकता था। उदाहरण के लिए कुछ AJAX क्रियाओं के बाद।

अधिक आप सेलेनियमएचक्यू पृष्ठ पर पा सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.