যদি সেলেনিয়াম ওয়েবড্রাইভার ব্যবহার করে উপাদান উপস্থিত থাকে তবে পরীক্ষা করুন?


163

কোনও উপাদান উপস্থিত থাকলে কীভাবে পরীক্ষা করার উপায় আছে? যে কোনও ফাইন্ডলিমেন্ট পদ্ধতিটি একটি ব্যতিক্রমের মধ্যেই শেষ হয়ে যাবে, তবে আমি যা চাই তা তা নয়, কারণ এটি হতে পারে যে কোনও উপাদান উপস্থিত নেই এবং এটি ঠিক আছে, এটি পরীক্ষার ব্যর্থতা নয়, সুতরাং একটি ব্যতিক্রম সমাধান হতে পারে না।

আমি এই পোস্টটি পেয়েছি: সেলেনিয়াম সি # ওয়েবড্রাইভার: এলিমেন্ট উপস্থিত না হওয়া পর্যন্ত অপেক্ষা করুন তবে এটি সি # এর জন্য এবং আমি এটিতে খুব একটা ভাল না। কোডটি যে কেউ জাভাতে অনুবাদ করতে পারে? আমি দুঃখিত, বন্ধুরা, আমি এটি অ্যালিপসে চেষ্টা করেছিলাম তবে আমি ঠিক এটি জাভা কোডে পাই না।

এই কোড:

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);
    }
}

আমার কাছে বেশ কয়েকটি পদ্ধতি রয়েছে যা কোনও জিনিসের জন্য যাচাই করতে খুব কার্যকরভাবে কাজ করে তবে এটি আপনি এটির সাথে কী করতে চাইছেন তার উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি উপাদানটি উপস্থিত না হওয়া পর্যন্ত সন্ধান করতে চান, এটি উপস্থিত না হওয়া অবধি কি আপনি এটি অনুসন্ধান করতে চান বা আপনি এটি সন্ধানের চেষ্টা করতে চান না?
সিবিআররেসার

1
জাভা সি # এর সাথে খুব সাদৃশ্যযুক্ত আমি মনে করি আপনি এখানে যে প্রধান সমস্যাটি চালাচ্ছেন তার মধ্যে একটি জাভাতে এটি আইওয়েব্লেমেন্টের পরিবর্তে ওয়েবইলেমেন্ট
সাদৃশ্যযুক্ত

অন্তর্নিহিত অপেক্ষার পদ্ধতি সম্পর্কে আপনি কি জানেন? পরীক্ষার শুরুতে এটি স্থাপন করে আপনাকে কখনই কোনও উপাদানটির অস্তিত্ব পরীক্ষা করতে হবে না কারণ এটি পোলের জন্য অন্তর্নিহিত অপেক্ষার মানটি ব্যবহার করে, তবে যদি এটির মানটি অতিক্রম করে তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে
বব ইভান্স

জাভাতে ওয়েবড্রাইভারওয়াইট সম্পর্কে আমার পোস্টটি এখানে: ওয়েবড্রাইভারওয়াইট

যদি উভয় ক্ষেত্রেই ঠিক থাকে তবে এটি পরীক্ষার পারফরম্যান্সের জন্য সমস্যাযুক্ত হতে পারে, কারণ যে উপাদানটির অস্তিত্ব আপনি প্রত্যাশা করেন না এটি অপেক্ষা করার জন্য অপেক্ষা করার সময়টি সত্যিই যুক্ত হয়। অপেক্ষার সময়টি পেতে আমি কয়েকটি হ্যাক ব্যবহার করেছি, তবে এর সত্যিকারের কোনও পরিষ্কার সমাধান এখনও খুঁজে পাইনি।
mrfreeter

উত্তর:


277

findElementsপরিবর্তে ব্যবহার করুন findElement

findElements যদি কোনও ব্যতিক্রমের পরিবর্তে কোনও ম্যাচের উপাদান না পাওয়া যায় তবে খালি তালিকাটি ফিরিয়ে দেবে।

কোনও উপাদান উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে, আপনি এটি ব্যবহার করে দেখতে পারেন

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

যদি কমপক্ষে একটি উপাদান পাওয়া যায় এবং অস্তিত্ব না থাকে তবে এটি সত্য হবে।

অফিসিয়াল ডকুমেন্টেশন এই পদ্ধতির প্রস্তাব দেয়:

সন্ধানকারী উপাদানটি অ-উপস্থিত উপাদানগুলির সন্ধানের জন্য ব্যবহার করা উচিত নয়, ফোল্ডেলমেন্টগুলি (দ্বারা) ব্যবহার করা উচিত এবং পরিবর্তে শূন্য দৈর্ঘ্যের প্রতিক্রিয়া জোর দেওয়া উচিত।


32
এটি আপনার পরীক্ষাগুলি চালাতে অনেক সময় যোগ করবে। আপনি এই কৌশলটি কোথাও ব্যবহার করতে পারবেন না।
Droogans

8
@ দ্রোগানস - আমি আপনার পরীক্ষাগুলিতে সময় যোগ করব না। এটি অকার্যকর হওয়ার কারণ হ'ল ডিফল্ট অন্তর্নিহিত অপেক্ষার অবকাশ এখনও 0 আছে you
jangofan

1
ভাল কল জাঙ্গোফান! ড্রাইভার টাইমআউটগুলির অন্তর্নিহিত অপেক্ষাকে শূন্যে পরিবর্তন করে, তারপরে এর আগের মানটিতে ফিরে পরিবর্তন করে আমি এই কৌশলটি সফলভাবে ব্যবহার করেছি।
এমেরি

3
এটি একটি NoSuchElementFound ব্যতিক্রম দিয়েছে, যা একটি লজ্জাজনক বিষয় হিসাবে আমি আশা করি যে কোনও নির্দিষ্ট ক্ষেত্রে সেই ব্যতিক্রমটি ধরা এড়াতে এটি ব্যবহার করা হবে।

1
আরও সহজ উপায়টি ব্যবহার করা হচ্ছে: যদি (ড্রাইভার.getPageSource () থাকে ("পৃষ্ঠায় একটি পাঠ্য")) থাকে {page পৃষ্ঠাতে এই পাঠ্য থাকে তবে শর্তটি সত্য হবে, না হলে এটি মিথ্যা হবে এবং আপনি কোড করতে পারেন সেই অনুযায়ী।
প্রদ্যোট

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
তাই না? এটা ছিল আপনার পরামর্শ! যদি আপনার পরীক্ষার উপাদানটি খুঁজে না পাওয়ার আশা করে তবে এটি যাওয়ার একটি ভাল উপায় good যেমন আপনি দেখান, কেবল নাল এবং 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. আপনি যে উপাদানটি পরীক্ষা করতে যাচ্ছেন পদ্ধতি দ্বারা সরবরাহ করা উচিত। // প্রাক্তন: বাই.আইডি ("আইডি")
  3. সেকেন্ডে সময় সীমা।

উদাহরণ: ওয়েটফরএলমেন্টপ্রেসেন্ট (ড্রাইভার, বাই.আইডি ("আইডি"), 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
এই উত্তরটি লেখার পর থেকে আমি শিখেছি এক্সপেক্টেড কনডিশনগুলি ব্যবহার করা আরও ভাল ফর্ম হিসাবে বিবেচিত হয় তবে কোনও উপাদান উপস্থিত না থাকলে তা নির্ধারণের চেষ্টা করার সময় ট্রাই ক্যাচ স্টেটমেন্ট ব্যবহার করা দরকারী useful
এসোটেরিকনসেনস

আমি IE8 পরীক্ষা করতে হবে সেলেনিয়াম পুরানো সংস্করণে আটকে আছি। তবে আমি চেষ্টা করব যে যখন আমি আপগ্রেড করতে পারি
নিকোলাস ডিপিয়াজা

প্রতিবার আপনার পদ্ধতিটি অন্তর্নিহিত অপেক্ষার সময়সীমা নির্ধারণ করবে, তবে যৌক্তিকভাবে আমাদের কেবল চালিত বস্তু আরম্ভ করার পরে কেবল চালক সেশনে সেট আপ করার পরে অন্তর্ভুক্ত অপেক্ষা স্থির করা উচিত।
শেখর স্বামী

3

জাভা ব্যবহার করে নিম্নলিখিত ফাংশন / মিথো লিখুন:

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

জোর দেওয়ার সময় উপযুক্ত পরামিতি সহ পদ্ধতিটি কল করুন।


2

আপনি যদি রুবিতে আরএসপেক-ওয়েবড্রাইভার ব্যবহার করছেন, আপনি এই স্ক্রিপ্টটি ধরে ধরে ব্যবহার করতে পারেন যে কোনও উপাদান সত্যই উপস্থিত না হওয়া উচিত এবং এটি একটি উত্তীর্ণ পরীক্ষা।

প্রথমে আপনার ক্লাস আরবি ফাইল থেকে প্রথমে এই পদ্ধতিটি লিখুন

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
}

এখানে একই সমস্যা বিদ্যমান: "// * [@ আইডি = 'সাবমিট']" উপাদানটি না থাকলে কী হয়? তারপরে একটি ব্যতিক্রম নিক্ষেপ করা হবে, সুতরাং যদি শর্তসাপেক্ষ কখনও মূল্যায়ন করে না
মিঃ বিবিট


1

ব্যক্তিগতভাবে, আমি সবসময় উপরের উত্তরগুলির মিশ্রণের জন্য যাই এবং size() > 0পরামর্শটি ব্যবহার করে পুনরায় ব্যবহারযোগ্য স্থিতিশীল ইউটিলিটি পদ্ধতি তৈরি করি :

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

এটি পরিষ্কার, পুনরায় ব্যবহারযোগ্য, রক্ষণাবেক্ষণযোগ্য ... সমস্ত ভাল জিনিস ;-)


0

কোনও নির্দিষ্ট এলিমেন্ট উপস্থিত রয়েছে কিনা তা খুঁজে পেতে আমাদের ফাইন্ড এলিমেন্ট () এর পরিবর্তে ফাইন্ড এলিমেন্টস () পদ্ধতি ব্যবহার করতে হবে ..

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

এটি করা উচিত:

try {
    driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
    //do what you need here if you were expecting
    //the element wouldn't exist
}

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 ক্রিয়া করার পরে।

আরও আপনি সেলেনিয়ামএইচকিউ পৃষ্ঠায় খুঁজে পেতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.