সেলেনিয়ামে পৃষ্ঠা লোডের জন্য অপেক্ষা করুন


240

পৃষ্ঠাটি লোড হওয়ার জন্য আপনি কীভাবে সেলেনিয়াম 2.0 অপেক্ষা করবেন?


7
আমার কাছে কেবল পলের উত্তরটি সঠিক দেখায়, বেশিরভাগ সর্বাধিক ভোট দেওয়া উত্তর কোনও নির্দিষ্ট উপাদানের জন্য অপেক্ষা করার কথা বলে।
xyz

উত্তর:


138

আপনি নিম্নলিখিত কোড ব্যবহার করে পৃষ্ঠাটি লোডও করতে পারেন

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

 wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

22
আপনি ভাবেন যে এটির মতো কিছু তৈরি করা হবে page পৃষ্ঠা লোডের জন্য অপেক্ষা করা ওয়েবে একটি দুর্দান্ত সাধারণ বিষয়।
PRMan

19
এটি কি সত্যই সারাক্ষণ কাজ করে? হতে পারে আমি আপনার কোড থেকে কিছু মিস করছি তবে আপনি ডোমটির জন্য প্রস্তুত অবস্থায় অপেক্ষা করছেন। তবে বিবেচনা করুন যে আপনার কোডটি খুব দ্রুত কার্যকর হলে পূর্ববর্তী পৃষ্ঠাটি এখনও লোড করা নাও হতে পারে এবং আপনি এখনও পুরানো পৃষ্ঠায় থাকা সত্ত্বেও এটি সত্য হবে। আপনার যা করতে হবে তা হল বর্তমান পৃষ্ঠাটি আনলোড হওয়ার অপেক্ষা করা এবং তারপরে আপনার উপরের কোডটি কল করুন। পৃষ্ঠাটি আনলোড শনাক্ত করার একটি উপায় হ'ল বর্তমান পৃষ্ঠায় একটি ওয়েবেলেট পাওয়া এবং এটি বাসি না হওয়া পর্যন্ত অপেক্ষা করা। #ythetestinggoat.com/…
জর্জ

6
এফওয়াইআই - তবুও উপরের পৃষ্ঠাটি গ্যারান্টি দেয় না যে পৃষ্ঠাটি সম্পূর্ণ - ঠিক যে ডোম প্রস্তুত। যে কোনও ডোজো / জকিউরি এখনও পৃষ্ঠায় গতিশীল উপাদান তৈরি করতে পারে যাতে আপনার সাথে ডায়মিনিক উপাদানগুলির সাথে আলাপ করার আগে প্রথমে অপেক্ষা করতে হবে।
জর্জ

3
সচেতন হন যে এই পদ্ধতিটি কেবল ডিওএম পরীক্ষা করে। আপনি যদি অ্যাজাক্স বা অ্যাঙ্গুলারজেএস ব্যবহার করেন তবে এটি কাজ করবে না কারণ এমন কিছু অ্যাসিনক্রোনাস কল থাকবে যা দস্তাবেজ দ্বারা সনাক্ত করা যায় না readyডিয়ারস্টেট।
হোমউইকার

3
এটি সি # কোড। এটি জাভা নিয়ে কাজ করে না, এবং জাভা সম্পর্কে প্রশ্ন করা প্রশ্ন ।
কিংমারে

89

ক্লাস ওয়েবড্রাইভারওয়েট ব্যবহার করুন

এছাড়াও এখানে দেখুন

আপনি কিছু উপাদান প্রদর্শন আশা করতে পারেন। সি # তেমন কিছু:

WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));

এটি দুর্দান্ত কাজ করেছে। সমস্যাটি সমাধানের এটি খুব সুন্দর একটি আধুনিক উপায়।
ক্রেজিডার্ট

3
@ এমমানুয়েলএঞ্জেলো.আর টাইমস্প্যান একটি। নেট ডেটা স্ট্রাকচার।
rjzii

12
যদি আমি না জানি যে পৃষ্ঠায় কোন উপাদানটি থাকবে?
JustGoscha

3
এটি পুরো পৃষ্ঠার জন্য নয়, কোনও নির্দিষ্ট উপাদান লোড হওয়ার জন্য অপেক্ষা করতে কাজ করবে।
xyz

1
এটি কোনও ক্ষেত্রেই কোনও গ্যারান্টি দেয় না যে কোনও উপাদান পুরোপুরি লোড হবে না বা প্রশ্নের উত্তর দেয় না। কীভাবে কেউ এটিকে সমর্থন করতে পারে?
বরিস ডি তেওহরভ

36

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

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

উত্স: অন্তর্নিহিত-অপেক্ষা


3
এটি পৃষ্ঠা লোডের জন্য অপেক্ষা করতে সাহায্য করবে না।
xyz

এর অর্থ এটি ব্যতিক্রম বাড়ানোর আগে এটি 10 ​​সেকেন্ডের মধ্যে কিছু চেষ্টা করবে। সুতরাং এটি নিশ্চিত হতে পারে না যে এটি 10 ​​সেকেন্ড দেরি করে নিবে।
স্কাইসাইন

1
@xyz - কেন এটি সাহায্য করবে না?
মাস্টারজয়ে 2

@ testerjoe2 এটি নির্দিষ্ট উপাদান সন্ধান না হওয়া পর্যন্ত অপেক্ষা করে, পৃষ্ঠা লোডের জন্য কীভাবে অপেক্ষা করা যায় তা নিয়ে প্রশ্ন।
xyz

35

সাধারণভাবে, সেলেনিয়াম ২.০ সহ ওয়েব ড্রাইভারটি কেবল পৃষ্ঠা লোড হয়েছে কিনা তা স্থির করে নিলে কেবলমাত্র কলিং কোডে নিয়ন্ত্রণ ফিরিয়ে আনতে হবে। যদি এটি না হয়, আপনি কল করতে পারেন waitforelemement, কোন চক্রটি রাউন্ড কলিং findelementএটি না পাওয়া অবধি বা সময় শেষ না হওয়া পর্যন্ত (সময় নির্ধারণ করা যাবে)।


2
পলের উত্তর যুক্ত করা। দয়া করে এটিও স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ৫৮৮৮74৪৩/২ দেখুন
খান

27
দুর্ভাগ্যক্রমে, সেলেনিয়াম 2 কোনও পৃষ্ঠা লোড হওয়ার জন্য সব ক্ষেত্রে অপেক্ষা করে না। উদাহরণস্বরূপ ওয়েবএলিমেন্ট: ক্লিক করুন () অপেক্ষা করবেন না এবং এটি পরিষ্কারভাবে সম্পর্কিত জাভাদোকটিতে বলা হয়েছে। তবে, তারা বোঝায় না যে আমি কীভাবে একটি নতুন পৃষ্ঠা লোড হওয়ার জন্য চেক করতে পারি। If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
সেবি

ডক থেকে .. এবং লোড সম্পূর্ণ না হওয়া পর্যন্ত পদ্ধতিটি অবরুদ্ধ হবে ...
xyz

2
@ কর্ণা: হ্যাঁ, তাত্ত্বিকভাবে এটি সর্বদা এবং অনুশীলনে এটি বেশিরভাগ সময় করা উচিত। সেই সময় সেলেনিয়াম ব্যবহার করে হাইলাইট করা হয়েছিল যে এমন কিছু সময় ছিল যখন পৃষ্ঠার লোড শেষ হয়ে গেছে বলে মনে হয়েছিল তবে তা হয়নি। আমি সেলেনিয়াম খুব বেশি ব্যবহার করি নি তাই এটি হতে পারে বা এখনও নাও হতে পারে।
পল হ্যাডফিল্ড

3
আমি সম্মত হই: বিশেষত ইন্টারনেট এক্সপ্লোরার ড্রাইভার বগি এবং কিছু পৃষ্ঠা তত্ক্ষণাত লোড হওয়া সত্ত্বেও তত্ক্ষণাত নিয়ন্ত্রণ ফিরিয়ে দেয়। এটি আমার ক্ষেত্রে, আমি JavascriptExecutorনথির জন্য অপেক্ষা করে , একটি অপেক্ষা যোগ করেছি ready সেলেনিয়াম থেকে ব্রাউজারে রাউন্ড ট্রিপ হওয়ার কারণে, আমার ধারণা রেসের অবস্থা হ্রাস পেয়েছে, এবং এটি "সর্বদা" আমার পক্ষে কাজ করে। "ক্লিক করুন ()" পরে যখন আমি কোনও পৃষ্ঠা লোড হওয়ার আশা করি, আমি রেডস্টেটের জন্য স্পষ্টভাবে অপেক্ষা করি (ওয়েবড্রাইভারওয়াইট ব্যবহার করে)। ]
dmansfield

22

রুবি বাস্তবায়ন:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}

17
পাইথন সমতুল্য: WebDriverWait (ড্রাইভার, 10) .until (ল্যামডা D: d.execute_script ( 'আসতে document.readyState') == 'সম্পূর্ণ')
অকস্মাৎ জ্বলিয়া ত্তঠা

2
পাইথন উপরের কোডটি ব্যবহার করে তবে এই লাইনে ভুলবেন না .. | selenium.webdriver.support.ui থেকে
ওয়েবড্রাইভারওয়েট

পৃষ্ঠাটি পুরোপুরি লোড না হওয়া অবস্থায় একটি উপাদানটিতে ক্লিক করতে আমার সমস্যা হয়েছিল। পাইথনে আমি সময় চেষ্টা করেছি leep ঘুম (30)। এটা কাজ করেছে. এটি সর্বদা সর্বোচ্চ 30 সেকেন্ডের জন্য অপেক্ষা করবে। আমি তখন নিম্নলিখিত কোডটি চেষ্টা করেছিলাম এবং এটি এখন আরও কার্যকর, দ্রুত। ওয়েবড্রাইভারওয়েট (ড্রাইভার, 10) .উনটিল (ল্যাম্বদা ডি: ড্রাইভার.ফাইন্ড_ইলেটমেন্ট_বি_স্পাথ ("// ডিভি [[= 'প্রশাসন']" ") ক্লিক করুন ())
রিয়াজ লাধানী

20

আপনি System.outলাইনটি সরিয়ে ফেলতে পারেন । এটি ডিবাগ উদ্দেশ্যে যুক্ত করা হয়।

WebDriver driver_;

public void waitForPageLoad() {

    Wait<WebDriver> wait = new WebDriverWait(driver_, 30);
    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            System.out.println("Current Window State       : "
                + String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")));
            return String
                .valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
                .equals("complete");
        }
    });
}

এই টিপস জন্য ধন্যবাদ। আমি আমার সেলেনিয়াম হেল্পারে এটি যুক্ত করি; cf. জাভাবক্স
বলি 38

17

এই সমস্ত সমাধান নির্দিষ্ট ক্ষেত্রে ক্ষেত্রে ঠিক আছে তবে তারা কমপক্ষে কয়েকটি সম্ভাব্য সমস্যায় ভুগছে:

  1. এগুলি যথেষ্ট জেনেরিক নয় - তারা আপনার আগে জানতে চেয়েছিল যে আপনি যে পৃষ্ঠাটিতে যাচ্ছেন তার কোনও নির্দিষ্ট শর্তটি সত্য হবে (উদাহরণস্বরূপ কিছু উপাদান প্রদর্শিত হবে)

  2. এগুলি এমন একটি রেসের শর্তের জন্য উন্মুক্ত যেখানে আপনি এমন একটি উপাদান ব্যবহার করেন যা পুরানো পৃষ্ঠায় পাশাপাশি নতুন পৃষ্ঠায় উপস্থিত থাকে।

এই সমস্যাটি এড়ানো জেনেরিক সমাধানের জন্য আমার প্রচেষ্টা এখানে রয়েছে (পাইথনে):

প্রথমত, একটি জেনেরিক "অপেক্ষা" ফাংশন (আপনি যদি পছন্দ করেন তবে ওয়েবড্রাইভারওয়াইট ব্যবহার করুন) আমি তাদের কুৎসিত মনে করি:

def wait_for(condition_function):
    start_time = time.time()
    while time.time() < start_time + 3:
        if condition_function():
            return True
        else:
            time.sleep(0.1)
    raise Exception('Timeout waiting for {}'.format(condition_function.__name__))

এরপরে, সমাধানটি এই স্তরের উপর নির্ভর করে যে সেলেনিয়াম শীর্ষ স্তরের সহ কোনও পৃষ্ঠার সমস্ত উপাদানগুলির জন্য একটি (অভ্যন্তরীণ) আইডি-নম্বর রেকর্ড করে <html> উপাদান । যখন একটি পৃষ্ঠা সতেজ বা লোড হয়, এটি একটি নতুন আইডি সহ একটি নতুন এইচটিএমএল উপাদান পায়।

সুতরাং, ধরে নিয়ে আপনি উদাহরণস্বরূপ "আমার লিঙ্ক" পাঠ্যের একটি লিঙ্কে ক্লিক করতে চান:

old_page = browser.find_element_by_tag_name('html')

browser.find_element_by_link_text('my link').click()

def page_has_loaded():
    new_page = browser.find_element_by_tag_name('html')
    return new_page.id != old_page.id

wait_for(page_has_loaded)

আরও পাইথোনিক, পুনরায় ব্যবহারযোগ্য, জেনেরিক সহায়তার জন্য আপনি একটি প্রসঙ্গ পরিচালক প্রস্তুত করতে পারেন:

from contextlib import contextmanager

@contextmanager
def wait_for_page_load(browser):
    old_page = browser.find_element_by_tag_name('html')

    yield

    def page_has_loaded():
        new_page = browser.find_element_by_tag_name('html')
        return new_page.id != old_page.id

    wait_for(page_has_loaded)

এবং তারপরে আপনি এটিকে কোনও সেলেনিয়াম মিথস্ক্রিয়াতে ব্যবহার করতে পারেন:

with wait_for_page_load(browser):
    browser.find_element_by_link_text('my link').click()

আমি হিসেব করি বুলেটপ্রুফ! আপনি কি মনে করেন?

এটি সম্পর্কে একটি ব্লগ পোস্টে আরও তথ্য


জাভা কোড যা আপনার সমাধানটি কার্যকর করে তার জন্য আরও বিশেষভাবে অনুসন্ধান করার আগে আমি আপনার ওয়েব পৃষ্ঠাটি পড়ি। এখন পর্যন্ত কিছুই নেই ...
অ্যান্ড্রু লরিয়ান

11

আপনি ক্লাসটিও ব্যবহার ExpectedConditionsকরতে পারেন: কোনও পদক্ষেপ গ্রহণের আগে আপনি আরও পদক্ষেপ নেওয়ার আগে ওয়েবপৃষ্ঠায় কোনও উপাদান প্রদর্শিত হওয়ার জন্য স্পষ্টভাবে অপেক্ষা করতে

ExpectedConditionsকোনও উপাদান দৃশ্যমান কিনা তা নির্ধারণ করতে আপনি ক্লাসটি ব্যবহার করতে পারেন :

WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));

আপনি যে ExpectedConditions class Javadocসমস্ত শর্ত পরীক্ষা করতে সক্ষম হচ্ছেন তার তালিকা দেখুন ।


11

ইমরানের উত্তর জাভা for-এর জন্য পুনঃনির্দেশিত:

    WebDriverWait wait = new WebDriverWait(driver, 30);

    wait.until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript(
                "return document.readyState"
            ).equals("complete");
        }
    });

10

এটি ওয়েবড্রাইভারের একটি গুরুতর সীমাবদ্ধতা বলে মনে হচ্ছে। স্পষ্টতই কোনও উপাদানটির জন্য অপেক্ষা করা বোঝানো হচ্ছে যে পৃষ্ঠাটি লোড হচ্ছে না, বিশেষত ডিওএম সম্পূর্ণরূপে বিল্ড (অনড্রেড স্টেট) হতে পারে যার ফলে জেএস এখনও কার্যকর করছে এবং সিএসএস এবং চিত্রগুলি এখনও লোড হচ্ছে।

আমি বিশ্বাস করি যে সহজ সমাধান হ'ল সবকিছু শুরু করার পরে অনলোড ইভেন্টের উপরে একটি জেএস ভেরিয়েবল সেট করা এবং সেলেনিয়ামে এই জেএস ভেরিয়েবলটি পরীক্ষা করে অপেক্ষা করুন।


সাইটটি যদি আপনার পরিবর্তন করতে হয় তবে এটি সহজ!
পুনরায় পোস্টার

হ্যাঁ, jQuery.js সম্পাদন করতে কেবল একটি জাভাস্ক্রিপ্টএক্সিকিউটর ব্যবহার করুন এবং তারপরে আপনার কাছে jQuery লোড ইভেন্টগুলিতে অ্যাক্সেস রয়েছে। যদিও এটি প্রয়োজনীয় তখন এটি একটি বিরল ঘটনা। স্ট্যান্ডার্ড ওয়েবড্রাইভারের 98% যথাযথ অপেক্ষা করতে যথেষ্ট ক্ষমতা রয়েছে।
জাঙ্গোফান

@ জাজাফোফান এর উদাহরণটি দেখতে অবাক হবেন ... আমি ফ্রন্ট-এন্ড লোক তাই জাভাস্ক্রিপ্টএক্সিকিউটর কোথায় বা কীভাবে ব্যবহৃত হয়েছে তা নিশ্চিত নয়।
ব্র্যাডগ্রিনস

@ ব্র্যাডগ্রেনস - ঠিক আছে, আমার প্রকল্পটি এখানে দেখুন: github.com/djangofan/jquery-growl-selenium- উদাহরণ । যদি আপনার উদাহরণটি শেষ করতে ব্যান্ডউইদথ থাকে তবে আমি জেগ্রোলকে সেই পরীক্ষার প্রকল্পে কাজ করতে বেশিরভাগই পেতে পারি না, যদিও জিকুয়েরি ঠিকঠাক কাজ করে।
djangofan

1
: Djangofan এর মন্তব্যের @BradGreens উপরন্তু এখানে আমার উত্তর দেখার stackoverflow.com/a/24638792/730326
jmathew

9

আপনি যদি কোনও নির্দিষ্ট উপাদান লোড হওয়ার জন্য অপেক্ষা করতে চান তবে আপনি এই isDisplayed()পদ্ধতিটি একটিতে ব্যবহার করতে পারেন RenderedWebElement:

// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
    // Browsers which render content (such as Firefox and IE) return "RenderedWebElements"
    RenderedWebElement resultsDiv = (RenderedWebElement) driver.findElement(By.className("gac_m"));

    // If results have been returned, the results are displayed in a drop down.
    if (resultsDiv.isDisplayed()) {
      break;
    }
}

( 5 মিনিট শুরু করা গাইডের উদাহরণ )


4
এক বছর পরে (বর্তমান সেলেনিয়াম সংস্করণ ২.২৩.১), এপিআইতে নেই RenderedWebElement। তবে, isDisplayed()পদ্ধতিটি এখন সরাসরি উপলভ্য WebElement
পেট্রা জেনেসেক

1
পোলিং ভয়ঙ্কর যখন এড়ানো যায়।
পুনরায় পোস্টার

8

এই শর্ত না দেওয়া পর্যন্ত এই অপেক্ষাটিতে স্পষ্টভাবে অপেক্ষা করুন বা শর্তাধীন অপেক্ষা করুন।

WebDriverWait wait = new WebDriverWait(wb, 60);
wait.until(ExpectedConditions.elementToBeClickable(By.name("value")));

এটি প্রতিটি ওয়েব উপাদানটির জন্য 60 সেকেন্ডের জন্য অপেক্ষা করবে।

প্রদত্ত সময় পর্যন্ত পৃষ্ঠায় প্রতিটি উপাদানটির অপেক্ষার জন্য স্পষ্টভাবে অপেক্ষা করুন।

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

এটি প্রতিটি ওয়েব উপাদানটির জন্য 60 সেকেন্ডের জন্য অপেক্ষা করবে।


5

প্রদত্ত সময় পর্যন্ত পৃষ্ঠায় প্রতিটি উপাদানটির অপেক্ষার জন্য স্পষ্টভাবে অপেক্ষা করুন।

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

30 সেকেন্ডের জন্য পৃষ্ঠাতে প্রতিটি উপাদানটির জন্য এটি অপেক্ষা করুন।

অন্য অপেক্ষাটি প্রদত্ত শর্ত না হওয়া পর্যন্ত এই অপেক্ষায় স্পষ্টভাবে অপেক্ষা বা শর্তসাপেক্ষ অপেক্ষা wait

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

আইডিতে স্থির উপাদান আইডি দিন যা স্বতঃস্ফূর্তভাবে পৃষ্ঠায় প্রদর্শিত হয় পৃষ্ঠাটি লোড হওয়ার সাথে সাথে।


4

আমি অবাক হয়েছি যে পূর্বাভাসগুলি প্রথম পছন্দ নয় কারণ আপনি সাধারণত জানেন যে আপনি পরবর্তী পৃষ্ঠাটিতে লোডের জন্য অপেক্ষা করছেন কোন উপাদান (গুলি) এর সাথে আপনি ইন্টারঅ্যাক্ট করবেন। আমার পদ্ধতির সবসময় তৈরি করা হয়েছে predicates / মতো কাজগুলির waitForElementByID(String id)এবংwaitForElemetVisibleByClass(String className) , ইত্যাদি এবং তারপর ব্যবহার এবং এই পুনরায় ব্যবহার যেখানেই আমি তাদের প্রয়োজন, আমি অপেক্ষা করছি একটি পৃষ্ঠা লোড অথবা পৃষ্ঠার বিষয়বস্তু পরিবর্তনের জন্য এটা হতে।

উদাহরণ স্বরূপ,

আমার পরীক্ষার ক্লাসে:

driverWait.until(textIsPresent("expectedText");

আমার পরীক্ষার শ্রেণিতে পিতামাতা:

protected Predicate<WebDriver> textIsPresent(String text){
    final String t = text;
    return new Predicate<WebDriver>(){
        public boolean apply(WebDriver driver){
            return isTextPresent(t);
        }
    };
}

protected boolean isTextPresent(String text){
    return driver.getPageSource().contains(text);
}

যদিও এটি অনেকটা মনে হচ্ছে, আপনার জন্য বারবার যাচাই করা এবং সময় নির্ধারণের আগে চূড়ান্ত অপেক্ষার সময় সহ কতক্ষণ পরীক্ষা করা যায় তার জন্য অন্তর অন্তর অন্তর্নিহিত যত্ন গ্রহণ করে। এছাড়াও, আপনি এই জাতীয় পদ্ধতি পুনরায় ব্যবহার করবেন।

এই উদাহরণে, পিতা বা মাতা বর্গ সংজ্ঞায়িত করা হয় এবং প্রবর্তিত WebDriver driverএবং WebDriverWait driverWait

আশা করি এটা কাজে লাগবে.


এটি আমাকে সাহায্য করে! এই দুর্দান্ত নমুনার জন্য ধন্যবাদ। আমি আমার সেলেনিয়াম হেল্পারে এটি যুক্ত করি; cf. জাভাবক্স
বলি 38

4

ওয়েবড্রাইভারের জন্য জাভা বাইন্ডিংগুলি ব্যবহার করার সময় পৃষ্ঠা লোডগুলির জন্য অপেক্ষা করার সর্বোত্তম উপায় হ'ল পেজ ফ্যাক্টরির সাথে পৃষ্ঠা অবজেক্ট ডিজাইন প্যাটার্নটি ব্যবহার করা। এটি আপনাকে এটি ব্যবহার করার অনুমতি দেয় AjaxElementLocatorFactoryযা এটি কেবল আপনার সমস্ত উপাদানগুলির জন্য বৈশ্বিক অপেক্ষা হিসাবে কাজ করে। ড্রপ-বাক্স বা জটিল জাভাস্ক্রিপ্ট ট্রানজিশনের মতো উপাদানগুলির এটির সীমাবদ্ধতা রয়েছে তবে এটি প্রয়োজনীয় কোডের পরিমাণকে হ্রাস করবে এবং পরীক্ষার সময়গুলিকে গতি বাড়িয়ে তুলবে। একটি ভাল উদাহরণ এই ব্লগপোস্টে পাওয়া যাবে। কোর জাভা সম্পর্কে প্রাথমিক ধারণা অনুমান করা হয়।

http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html


4

নোডজেএস সমাধান:

ইন Nodejs আপনি এটা প্রতিশ্রুতি মাধ্যমে পেতে পারেন ...

আপনি যদি এই কোডটি লিখেন তবে আপনি নিশ্চিত হয়ে উঠতে পারেন যে আপনি তখন পৌঁছালে পৃষ্ঠাটি সম্পূর্ণ লোড হয়ে গেছে ...

driver.get('www.sidanmor.com').then(()=> {
    // here the page is fully loaded!!!
    // do your stuff...
}).catch(console.log.bind(console));

আপনি যদি এই কোডটি লিখেন, আপনি নেভিগেট করবেন, এবং সেলেনিয়াম 3 সেকেন্ড অপেক্ষা করবে ...

driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...

সেলেনিয়াম ডকুমেন্টেশন থেকে:

this.get (url) → তারপরযোগ্য

প্রদত্ত ইউআরএল নেভিগেট করার জন্য একটি কমান্ডের তালিকা তৈরি করে।

ডকুমেন্টের লোড শেষ হয়ে গেলে সমাধান করা হবে এমন প্রতিশ্রুতি দেয় ।

সেলেনিয়াম ডকুমেন্টেশন (নোডেজ)


4

এখানে বর্তমানে সর্বাধিক উত্সাহিত উত্তরের একটি জাভা 8 সংস্করণ রয়েছে :

WebDriverWait wait = new WebDriverWait(myDriver, 15);
wait.until(webDriver -> ((JavascriptExecutor) myDriver).executeScript("return document.readyState").toString().equals("complete"));

কোথায় myDriverএকটি WebDriverবস্তু (আগে ঘোষিত)।

দ্রষ্টব্য : সচেতন হন যে এই পদ্ধতিটি ( document.readyState) কেবলমাত্র ডিওএম পরীক্ষা করে।


4

আপনার স্ক্রিপ্টে ফাংশনের নীচে কল করুন, জাভাস্ক্রিপ্ট ব্যবহার করে পৃষ্ঠাটি লোড না হওয়া পর্যন্ত এটি অপেক্ষা করবে

public static boolean isloadComplete(WebDriver driver)
{
    return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
            || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}

আমি শূন্যতার জন্য বুলিয়ান পরিবর্তন করেছি, তবে ক্রোমে কাজ করছি না
nosequeweaponer

3
/**
 * Call this method before an event that will change the page.
 */
private void beforePageLoad() {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("document.mpPageReloaded='notYet';");
}

/**
 * Call this method after an event that will change the page.
 * 
 * @see #beforePageLoad
 * 
 *      Waits for the previous page to disappear.
 */
private void afterPageLoad() throws Exception {
    (new WebDriverWait(driver, 10)).until(new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            Object obj = js.executeScript("return document.mpPageReloaded;");
            if (obj == null) {
                return true;
            }
            String str = (String) obj;
            if (!str.equals("notYet")) {
                return true;
            }
            return false;
        }
    });
}

যেখানে নথির কেবলমাত্র অংশ পরিবর্তন করা হচ্ছে সে ক্ষেত্রে আপনি নথী থেকে কোনও উপাদানতে পরিবর্তন করতে পারেন।

এই কৌশলটি আবেগের উত্তর থেকে অনুপ্রাণিত হয়েছিল।


3

সেলেনিয়ামওয়েটার :

import com.google.common.base.Function;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SeleniumWaiter {

      private WebDriver driver;

      public SeleniumWaiter(WebDriver driver) {
           this.driver = driver;
      }

      public WebElement waitForMe(By locatorname, int timeout){
           WebDriverWait wait = new WebDriverWait(driver, timeout);
           return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
      }

      public static Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
            // TODO Auto-generated method stub
            return new Function<WebDriver, WebElement>() {
                 @Override
                 public WebElement apply(WebDriver driver) {
                      return driver.findElement(locator);
                 }
            };
      }
 }

এবং আপনি এটি ব্যবহার :

_waiter = new SeleniumWaiter(_driver);

try {
   _waiter.waitForMe(By.xpath("//..."), 10);
} 
catch (Exception e) {
   // Error
}

3

আপনি পেজলডটাইমআউটটির জন্য সময় নির্ধারণ করতে নীচের বিদ্যমান পদ্ধতিটি নীচের উদাহরণে ব্যবহার করতে পারেন উদাহরণস্বরূপ পৃষ্ঠাটি লোড হতে 20 সেকেন্ডের বেশি সময় নিচ্ছে, তবে এটি পৃষ্ঠা পুনরায় লোডের একটি ব্যতিক্রম ছুঁড়ে ফেলবে

 WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)

2

আপনি কোনও পদক্ষেপ নেওয়ার আগে ওয়েবপৃষ্ঠায় কোনও উপাদান প্রদর্শিত হওয়ার জন্য স্পষ্টভাবে অপেক্ষা করতে পারেন (এলিমেন্ট.লিক্লিক () এর মতো)

driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
        @Override
        public WebElement apply(WebDriver d) {
        return d.findElement(By.id("myDynamicElement"));
}});

এটি আমি একই জাতীয় দৃশ্যের জন্য ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করে।


আমার মনে হয় ড্রাইভার.জেট কোডটিতে রিটার্ন কন্ট্রোলের আগে অ্যান্ডলোড ফাংশনটি শেষ হওয়ার জন্য অপেক্ষা করে, যদি না পৃষ্ঠাটিতে অজ্যাক্সের অনেক বেশি থাকে
Goh

2

আমার সহজ উপায়:

long timeOut = 5000;
    long end = System.currentTimeMillis() + timeOut;

        while (System.currentTimeMillis() < end) {

            if (String.valueOf(
                    ((JavascriptExecutor) driver)
                            .executeScript("return document.readyState"))
                    .equals("complete")) {
                break;
            }
        }

2

আমি দেখেছি সেরা উপায়টি হচ্ছে stalenessOfপ্রত্যাশিত শর্তটি ব্যবহার করা , পুরানো পৃষ্ঠাটি বাসি হয়ে যাওয়ার জন্য অপেক্ষা করা।

উদাহরণ:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement oldHtml = driver.findElement(By.tagName("html"));
wait.until(ExpectedConditions.stalenessOf(oldHtml));

পুরানো এইচটিএমএল ট্যাগের বাসি হয়ে যাওয়ার জন্য এটি দশ সেকেন্ড অপেক্ষা করবে এবং এটি না ঘটলে একটি ব্যতিক্রম ছুঁড়ে ফেলবে।


1
কোনও ওয়েব এলেমেন্ট বাসি বোঝায় না যে কোনও নতুন পৃষ্ঠা লোড হয়ে গেছে।
কোরি গোল্ডবার্গ ২

অবশ্যই, তবে এর অর্থ হল যে পুরানো পৃষ্ঠাটি আনলোড শেষ হয়েছে। আমার অভিজ্ঞতায়, পুরানো পৃষ্ঠাটি কখন আনলোড হয়েছে বা কোনও কারণে এটি বন্ধ হয়ে গেছে তা জানা ঠিক যেমন গুরুত্বপূর্ণ।
forresthopkinsa

অবশ্যই, আমি সম্পূর্ণ আনলোড / লোড প্রক্রিয়াটি পেতে অন্যান্য পরীক্ষার সাথে একত্রে stalenessOf ব্যবহার করি।
forresthopkinsa

2

আমি নোড + সেলেনিয়াম-ওয়েবড্রাইভার ব্যবহার করি (বর্তমানে সংস্করণটি 3.5.0)। আমি এর জন্য যা করি তা হ'ল:

var webdriver = require('selenium-webdriver'),
    driver = new webdriver.Builder().forBrowser('chrome').build();
;
driver.wait(driver.executeScript("return document.readyState").then(state => {
  return state === 'complete';
}))

2

আপনি অপেক্ষা করতে পারেন। সেলেনিয়ামে মূলত 2 প্রকারের অপেক্ষা রয়েছে

  • অন্তর্ভুক্ত অপেক্ষা
  • স্পষ্ট অপেক্ষা

- অন্তর্নিহিত অপেক্ষা

এটি খুব সাধারণ দয়া করে নীচের বাক্য গঠন দেখুন:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

- সুস্পষ্ট অপেক্ষা

প্রদত্ত শর্তটি না হওয়া পর্যন্ত এই অপেক্ষায় স্পষ্টতই অপেক্ষা করুন বা শর্তাধীন অপেক্ষা করুন।

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

আপনি অন্যান্য বৈশিষ্ট্য যেমন ব্যবহার করতে পারেন visblityOf(),visblityOfElement()



2

আমার ক্ষেত্রে, পৃষ্ঠা লোডের স্থিতি জানতে আমি নীচে ব্যবহার করেছি used আমাদের অ্যাপ্লিকেশনটিতে লোডিং জিআইএফ (গুলি) উপস্থিত রয়েছে এবং, স্ক্রিপ্টে অযাচিত অপেক্ষার সময়টি নির্মূল করার জন্য আমি তাদের নীচে শুনি।

public static void processing(){ 
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
}

যেখানে xpath এইচটিএমএল ডিওএমে জিআইএফ চিহ্নিত করে। এর পরে, আপনি নিজের ক্রিয়া পদ্ধতিতে ক্লিকও প্রয়োগ করতে পারেন।

public static void click(WebElement elementToBeClicked){
    WebDriverWait wait = new WebDriverWait(driver, 45);
    wait.until(ExpectedConditions.visibilityOf(element));
    wait.until(ExpectedConditions.elementToBeClickable(element)); 
    wait.ignoring(NoSuchElementException.class).ignoring(StaleElementReferenceException.class); elementToBeClicked.click(); 
 }

2

ম্যান এই সমস্ত উত্তরগুলির জন্য খুব বেশি কোড প্রয়োজন। এটি খুব সাধারণ হিসাবে এটি সাধারণ জিনিস হওয়া উচিত।

কেবল ওয়েবড্রাইভার দিয়ে কিছু সাধারণ জাভাস্ক্রিপ্ট কেন ইনজেক্ট করবেন না। আমি আমার ওয়েবস্ক্রেপার ক্লাসে এই পদ্ধতিটি ব্যবহার করি। আপনি জেএস না জানলেও জাভাস্ক্রিপ্ট বেশ বেসিক।

    def js_get_page_state(self):        
    """
    Javascript for getting document.readyState
    :return: Pages state.

    More Info: https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState
    """
    ready_state = self.driver.execute_script('return document.readyState')
    if ready_state == 'loading':
        self.logger.info("Loading Page...")
    elif ready_state == 'interactive':
        self.logger.info("Page is interactive")
    elif ready_state == 'complete':
        self.logger.info("The page is fully loaded!")
    return ready_state

1

ক্লিকের পরে নিম্নলিখিত আকর্ষণীয় পদ্ধতির সরবরাহ করার পরে কীভাবে সেলেনিয়াম পৃষ্ঠা লোডের জন্য অপেক্ষা করতে পাবেন?

  1. WebElementপুরানো পৃষ্ঠা থেকে একটিতে একটি রেফারেন্স সঞ্চয় করুন ।
  2. লিঙ্কে ক্লিক করুন.
  3. WebElementযতক্ষণ না StaleElementReferenceExceptionনিক্ষেপ করা হয় ততক্ষণ চালনা চালিয়ে যান ।

কোডের উদাহরণ:

WebElement link = ...;
link.click();
new WebDriverWait(webDriver, timeout).until((org.openqa.selenium.WebDriver input) ->
{
    try
    {
        link.isDisplayed();
        return false;
    }
    catch (StaleElementReferenceException unused)
    {
        return true;
    }
});

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

4
এই তোমাকে বলতে বর্তমান পৃষ্ঠার লোড হয় কিনা যাচ্ছে না এটা আপনাকে বলতে শেষ পৃষ্ঠা (বিশেষভাবে এক উপাদান) কিনা যাচ্ছে unloaded । আপনার এখনও বর্তমান পৃষ্ঠাটি লোড হওয়ার জন্য অপেক্ষা করতে হবে। বিটিডাব্লু, আপনি উপরের সাথে আপনার কোডটি প্রতিস্থাপন করতে পারেন new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
জেফসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.