দস্তাবেজ প্রস্তুত না হওয়া পর্যন্ত সেলেনিয়াম অপেক্ষা করুন


133

পৃষ্ঠাটি পুরোপুরি লোড হওয়ার সময় পর্যন্ত আমি কীভাবে আমাকে সেলেনিয়াম অপেক্ষা করতে পারি? আমি জেনেরিক কিছু চাই, আমি জানি যে আমি ওয়েবড্রাইভারওয়েট কনফিগার করতে পারি এবং এটি অপেক্ষা করার জন্য 'ফাইন্ড' এর মতো কিছু কল করতে পারি তবে আমি এদিকে যাই না। আমার কেবল এটি পরীক্ষা করা দরকার যে পৃষ্ঠাটি সফলভাবে লোড হয়ে গেছে এবং পরীক্ষার জন্য পরবর্তী পৃষ্ঠায় যেতে হবে।

আমি নেট থেকে কিছু পেয়েছি তবে এটি জাভাতে কাজ করতে পারিনি ...

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

কোন চিন্তা কেউ?


কেন আপনি অপেক্ষা করতে চান না?
আমে

7
তুমি বোঝাতে চেয়েছ? এটি সময় সাপেক্ষ, আমি কিছু 10 কে পৃষ্ঠাগুলি পরীক্ষা করছি।
গিরিশ

2
আমি বোঝাতে চাইছি, যদি আমি প্রচুর সংখ্যক লিঙ্কগুলি পরীক্ষা করে দেখছি তবে ঠিকঠাক ওয়েট যুক্ত করা ভাল ধারণা নাও হতে পারে?
গিরিশ

10
সেকেন্ডের নির্দিষ্ট সংখ্যার জন্য অপেক্ষা করা কোনও কাজে আসে না। এটা অনুমান করা হয়।
অ্যান্ডার্স লিন্ডন

প্রদত্ত যে কোনও পৃষ্ঠার জাভাস্ক্রিপ্ট যে কোনও জেনেরিক কোড চালাতে পারে, এটির সমাপ্তির জন্য অপেক্ষা করার জন্য একটি প্রোগ্রাম লেখা অসম্ভব। এটি হ্যালটিং সমস্যার একটি রূপ ( en.wikedia.org/wiki/Halting_problem )। এখানে যে কোনও সমাধানের জন্য আপস করা বা অন্তর্নিহিত ওয়েবপৃষ্ঠার অনুমানের ভিত্তিতে হওয়া দরকার।
স্পিড প্লেন

উত্তর:


83

এই কোড ব্যবহার করে দেখুন:

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

উপরের কোডটি পৃষ্ঠা লোড হওয়ার জন্য 10 সেকেন্ড পর্যন্ত অপেক্ষা করবে। পৃষ্ঠাটি লোডিংয়ের সময় ছাড়িয়ে গেলে এটি নিক্ষেপ করবে TimeoutException। আপনি ব্যতিক্রম ধরেন এবং আপনার প্রয়োজনগুলি করেন। ব্যতিক্রম নিক্ষেপ করার পরে এটি পৃষ্ঠা লোডিং ছেড়ে দেয় কিনা তা আমি নিশ্চিত নই। আমি এই কোডটি এখনও চেষ্টা করি নি এটি চেষ্টা করতে চান।

এটি একটি অন্তর্নিহিত অপেক্ষা। আপনি যদি এটি একবার সেট করে থাকেন তবে ওয়েব ড্রাইভার ইন্সটেন্সটি ধ্বংস না হওয়া পর্যন্ত এর সুযোগ থাকবে।

আরও তথ্যের জন্য ডকুমেন্টেশনWebDriver.Timeouts দেখুন ।


3
ধন্যবাদ, সুতরাং পৃষ্ঠাটি যদি 10 সেকেন্ডের আগে লোড হয়ে যায় তবে এখানে কী হবে, লোডের পরে পরবর্তী লাইনটি সম্পাদন করতে 10 সেকেন্ড অপেক্ষা করা হবে?
গিরিশ

না যদি আপনার পৃষ্ঠাটি 10 ​​সেকেন্ডের আগে লোড হয় তবে এটি অপেক্ষা শর্তটি শেষ করবে এবং পূর্ববর্তী লাইনটি কার্যকর করবে।
মনিগান্দন

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

19
এই পদ্ধতির সমস্যাটি হ'ল এটি সম্ভব যে ডম সম্পূর্ণরূপে অ্যাক্সেসযোগ্য নয় যদিও পূর্ববর্তী ওয়েটটি পূর্বে সফলভাবে একটি ওয়েবএলমেন্ট অবজেক্টটি ফিরিয়ে দেয়। তারপরে, আপনি যদি উপাদানটিতে ক্লিক করার চেষ্টা করেন তবে একটি বাসি উপাদান ব্যতিক্রম পাবেন। সুতরাং, এই উত্তর সম্পূর্ণ নিরাপদ নয়।
জাঙ্গোফান

3
এই টাইমআউটটি কীভাবে কোনও দস্তাবেজ লোড হওয়ার জন্য অপেক্ষা করার সাথে সম্পর্কিত?
অ্যান্ডারস লিন্ডন

90

আপনার প্রস্তাবিত সমাধানটি কেবলমাত্র DOM এরreadyState সিগন্যালের জন্য অপেক্ষা করে complete। কিন্তু ডিফল্টরূপে সেলেনিয়াম তাদের driver.get()এবং element.click()পদ্ধতির মাধ্যমে পৃষ্ঠা লোডগুলিতে (এবং আরও কিছুটা আরও) অপেক্ষা করার চেষ্টা করে। তারা ইতিমধ্যে ব্লক করছে, তারা পৃষ্ঠাটি সম্পূর্ণরূপে লোড হওয়ার জন্য অপেক্ষা করে এবং সেগুলি ঠিকঠাক কাজ করা উচিত।

সমস্যাটি, স্পষ্টতই, এজেএক্স অনুরোধগুলি এবং চলমান স্ক্রিপ্টগুলির মাধ্যমে পুনঃনির্দেশ করা হয় - সেগুলি সেলেনিয়ামের দ্বারা ধরা পড়তে পারে না, এটি তাদের সমাপ্ত হওয়ার জন্য অপেক্ষা করে না। এছাড়াও, আপনি এগুলি নির্ভরযোগ্যতার মাধ্যমে ধরতে পারবেন না readyState- এটি কিছুটা অপেক্ষা করে, যা কার্যকর হতে পারে, তবে এটি completeএজেএক্সের সমস্ত সামগ্রী ডাউনলোড হওয়ার অনেক আগে থেকেই এটি সংকেত দেয় ।

এমন কোনও সাধারণ সমাধান নেই যা সর্বত্র এবং প্রত্যেকের জন্য কাজ করবে, এ কারণেই এটি কঠিন এবং প্রত্যেকে কিছুটা আলাদা কিছু ব্যবহার করে।

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

আরও তথ্যের জন্য এই সম্পর্কে আমার দুটি উত্তর দেখুন:


20
এটি সঠিক নয়, সেলেনিয়াম element.click()কলগুলিতে অপেক্ষা করে না বা ব্লক করে না ।
hwjp

3
@hwjp আরও বিস্তারিত জানার যত্ন? জাভাডোকস অন্যথায় বলে : "এর ফলে যদি কোনও নতুন পৃষ্ঠা লোড হয়, পৃষ্ঠাটি লোড না হওয়া পর্যন্ত এই পদ্ধতিটি ব্লক করার চেষ্টা করবে।"
পেট্রা জেনেসেক

5
সিএফের কিছু কথোপকথন আমি মেইলিং তালিকায় রেখেছি বলে মনে হচ্ছে এটি সঠিক নয়। সেলেনিয়াম আপনি স্পষ্টভাবে একটি ইউআরএল অনুরোধ করার জন্য .get কলগুলিতে অবরুদ্ধ হতে পারে, তবে এটি ক্লিক কলগুলিতে বিশেষ কিছু করে না, কারণ আপনি "সত্যিকারের" হাইপারলিঙ্কে ক্লিক করেছেন কিনা বা জাভাস্ক্রিপ্ট দ্বারা আটকানো হবে এমন কোনওটি এটি বলতে পারে না। ..
hwjp

4
আমি মেলিং তালিকা আলোচনার শুরুতে একটি বাগের সাথে সংযুক্ত করি। এমনকি দস্তাবেজগুলিও সমতুল্য: "যদি ক্লিক () [...] একটি স্থানীয় ইভেন্ট প্রেরণ দ্বারা সম্পন্ন হয় তবে পদ্ধতিটি * অপেক্ষা করবে না"
hwjp

4
সুতরাং ব্রাউজারটি "নেটিভ ইভেন্টগুলি" ব্যবহার করছে কিনা তা সক্রিয় হয়ে যায়। এবং দেখে মনে হচ্ছে তাদের বেশিরভাগই ডিফল্টরূপে: কোড. google.com/p/selenium/wiki/… (তাই আমি বলব যে ডক্সগুলি সর্বোত্তমভাবে বিভ্রান্তিকর। মেলিং তালিকায় থাকবে)।
hwjp

61

এটি আপনার দেওয়া উদাহরণটির একটি কার্যকরী জাভা সংস্করণ:

void waitForLoad(WebDriver driver) {
    new WebDriverWait(driver, 30).until((ExpectedCondition<Boolean>) wd ->
            ((JavascriptExecutor) wd).executeScript("return document.readyState").equals("complete"));
}

সি # এর উদাহরণ:

public static void WaitForLoad(IWebDriver driver, int timeoutSec = 15)
{
  IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
  WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, timeoutSec));
  wait.Until(wd => js.ExecuteScript("return document.readyState").ToString() == "complete");
}

1
বাবু, আমি এটিকে অনুলিপি / আটকানো করছি। এই স্নিপেটটি কেবল উজ্জ্বল। কেন আমি এই ভেবে দেখিনি? সত্য যে একাধিক জোড়া আইবোল সর্বদা একটি ভাল সমাধানের দিকে নিয়ে যায়। ধন্যবাদ।
luis.espinal


3
জাভা 1.7 সংস্করণ: অপেক্ষা.until (নতুন ভবিষ্যদ্বাণী <ওয়েবেড্রাইভার> () {পাবলিক বুলিয়ান অ্যাপ্লিকেশন (ওয়েবড্রাইভার ড্রাইভার) {রিটার্ন ((জাভাস্ক্রিপ্টএক্সিকিউটর) ড্রাইভার)। এক্সেকিউটস্ক্রিপ্ট ("রিটার্ন ডকুমেন্ট। রেডিস্টেট") সমান ("সম্পূর্ণ");} });
luQ

1
যদি কেউ @ আইইউকিউ এর মাধ্যমে সমাধানটি ব্যবহার করতে চান তবে ভবিষ্যদ্বাণীটি আমদানি করেছেimport com.google.common.base.Predicate
Knu8

আমি এই ধারণাটি একটি ভিবি পরীক্ষা অ্যাপে চেষ্টা করেছি। বেশিরভাগ সময় কাজ করে। আমি কখনও কখনও এই ত্রুটিটি পাই: System.InuthorOperationException: OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndTrrowOnError (প্রতিক্রিয়া ত্রুটিপরিবর্তন) টেস্ট অ্যাপ্লিকেশন ক্লিক ক্লিক করুন (ডাবলিট ডিরেক্টরিতে ক্লিক করুন) ডি, ইন্টারনেটএক্সপ্লোরারড্রাইভার)। এক্সিকিউটস স্ক্রিপ্ট ("রিটার্ন ডকুমেন্ট। রেডিস্টেট") = "সম্পূর্ণ")। আমি মনে করি ত্রুটি ঘটেছিল কারণ ব্রাউজারটি বর্তমান পৃষ্ঠাটি আনলোড করে এবং কোনও নথির অবজেক্ট নয়। হয়তো করছেন "রিটার্ন document.readystate সামনে 1/2 সেকেন্ড অপেক্ষা করুন আইডিয়াস?
CoolBreeze

12

পাইথনে সম্পূর্ণ জেনারিক সমাধানের জন্য এখানে আমার প্রচেষ্টা:

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

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()

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

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


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

@hwjp আমি এই ফলাফলটি অনেকবার দুর্দান্ত ফলাফল সহ ব্যবহার করি, তবে দেখে মনে হচ্ছে এটি কোনও ক্ষেত্রে কার্যকর হয় না। ইস্যুটির স্ট্যাকওভারফ্লো.com
q/31985739/

7

আমারও একই সমস্যা ছিল। আমার দস্তাবেজ প্রস্তুত না হওয়া পর্যন্ত আমার অপেক্ষা করা দরকার তবে সমস্ত অ্যাজাক্স কল শেষ না হওয়া পর্যন্ত। দ্বিতীয় শর্তটি সনাক্ত করা কঠিন বলে প্রমাণিত হয়েছিল। শেষ পর্যন্ত আমি সক্রিয় আজাক্স কলগুলির জন্য পরীক্ষা করেছিলাম এবং এটি কার্যকর হয়েছিল।

javascript:

return (document.readyState == 'complete' && jQuery.active == 0)

সম্পূর্ণ সি # পদ্ধতি:

private void WaitUntilDocumentIsReady(TimeSpan timeout)
{
    var javaScriptExecutor = WebDriver as IJavaScriptExecutor;
    var wait = new WebDriverWait(WebDriver, timeout);            

    // Check if document is ready
    Func<IWebDriver, bool> readyCondition = webDriver => javaScriptExecutor
        .ExecuteScript("return (document.readyState == 'complete' && jQuery.active == 0)");
    wait.Until(readyCondition);
}

document.readyState == 'complete' && jQuery.active == 0প্রতিক্রিয়া জন্য কিছু আছে ?
Rain9333

7
WebDriverWait wait = new WebDriverWait(dr, 30);
wait.until(ExpectedConditions.jsReturnsValue("return document.readyState==\"complete\";"));

4

সি # নুনিটের জন্য, আপনাকে ওয়েবড্রাইভারকে জেএসেক্সেকিউটারে রূপান্তর করতে হবে এবং তারপরে ডকুমেন্টটি তৈরি করতে হবে কিনা তা পরীক্ষা করতে স্ক্রিপ্টটি সম্পাদন করতে হবে ready রেফারেন্সের জন্য কোড নীচে চেক করুন:

 public static void WaitForLoad(IWebDriver driver)
    {
        IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
        int timeoutSec = 15;
        WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, timeoutSec));
        wait.Until(wd => js.ExecuteScript("return document.readyState").ToString() == "complete");
    }

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


3

প্রাথমিক পৃষ্ঠা লোডের জন্য আমি লক্ষ্য করেছি যে ব্রাউজার উইন্ডোটি পৃষ্ঠা লোড সম্পন্ন না হওয়া অবধি প্রায়শই অপেক্ষা করে (উত্স সহ)

প্রতিস্থাপন করুন:

AppDriver.Navigate().GoToUrl(url);

সঙ্গে:

public void OpenURL(IWebDriver AppDriver, string Url)
            {
                try
                {
                    AppDriver.Navigate().GoToUrl(Url);
                    AppDriver.Manage().Window.Maximize();
                    AppDriver.SwitchTo().ActiveElement();
                }
                catch (Exception e)
                {
                    Console.WriteLine("ERR: {0}; {1}", e.TargetSite, e.Message);
                    throw;
                }
            }

ব্যবহারের চেয়ে:

OpenURL(myDriver, myUrl);

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

আপনি যদি পরবর্তী পৃষ্ঠা বা অন্য কোনও পৃষ্ঠা নেভিগেশন ট্রিগার ক্লিক করে পৃষ্ঠা লোডের জন্য অপেক্ষা করতে চান তবে "নেভিগেট ()", বেন ডায়ারের উত্তর (এই থ্রেড) কাজ করবে।


1

কটাক্ষপাত আছে ট্যাপেষ্ট্রি ওয়েব-কাঠামোর। আপনি সেখানে সোর্স কোডটি ডাউনলোড করতে পারেন ।

ধারণাটি হ'ল এই পৃষ্ঠাটি দেহের html বৈশিষ্ট্য দ্বারা প্রস্তুত signal জটিল মামলা মামলা উপেক্ষা করে আপনি এই ধারণাটি ব্যবহার করতে পারেন।

<html>
<head>
</head>
<body data-page-initialized="false">
    <p>Write you page here</p>

    <script>
    $(document).ready(function () {
        $(document.body).attr('data-page-initialized', 'true');
    });
    </script>  
</body>
</html>

এবং তারপরে সেলেনিয়াম ওয়েবড্রাইভারের এক্সটেনশন তৈরি করুন (টেপস্ট্রি ফ্রেমওয়ার্ক অনুযায়ী)

public static void WaitForPageToLoad(this IWebDriver driver, int timeout = 15000)
{
    //wait a bit for the page to start loading
    Thread.Sleep(100);

    //// In a limited number of cases, a "page" is an container error page or raw HTML content
    // that does not include the body element and data-page-initialized element. In those cases,
    // there will never be page initialization in the Tapestry sense and we return immediately.
    if (!driver.ElementIsDisplayed("/html/body[@data-page-initialized]"))
    {                
        return;
    }

    Stopwatch stopwatch = Stopwatch.StartNew();

    int sleepTime = 20;

    while(true)
    {
        if (driver.ElementIsDisplayed("/html/body[@data-page-initialized='true']"))
        {
            return;
        }

        if (stopwatch.ElapsedMilliseconds > 30000)
        {
            throw new Exception("Page did not finish initializing after 30 seconds.");
        }

        Thread.Sleep(sleepTime);
        sleepTime *= 2; // geometric row of sleep time
    }          
}

অ্যালিস্টার স্কট দ্বারা লিখিত ডিসপ্লেড এক্সটেনশন এলিমেন্টআইএস ব্যবহার করুন ।

public static bool ElementIsDisplayed(this IWebDriver driver, string xpath)
{
    try
    {
        return driver.FindElement(By.XPath(xpath)).Displayed;
    }
    catch(NoSuchElementException)
    {
        return false;
    }
}

এবং শেষ পর্যন্ত পরীক্ষা তৈরি করুন:

driver.Url = this.GetAbsoluteUrl("/Account/Login");            
driver.WaitForPageToLoad();

1

বেন ড্রায়ারের উত্তর আমার মেশিনে সংকলিত হয়নি ( "The method until(Predicate<WebDriver>) is ambiguous for the type WebDriverWait")।

ওয়ার্কিং জাভা 8 সংস্করণ:

Predicate<WebDriver> pageLoaded = wd -> ((JavascriptExecutor) wd).executeScript(
        "return document.readyState").equals("complete");
new FluentWait<WebDriver>(driver).until(pageLoaded);

জাভা 7 সংস্করণ:

Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver input) {
            return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete");
        }

};
new FluentWait<WebDriver>(driver).until(pageLoaded);

1

আমি এই কোডটি চেষ্টা করেছিলাম এবং এটি আমার পক্ষে কাজ করে। আমি যখনই অন্য পৃষ্ঠায় চলে যাই তখনই আমি এই ফাংশনটিকে কল করি

public static void waitForPageToBeReady() 
{
    JavascriptExecutor js = (JavascriptExecutor)driver;

    //This loop will rotate for 100 times to check If page Is ready after every 1 second.
    //You can replace your if you wants to Increase or decrease wait time.
    for (int i=0; i<400; i++)
    { 
        try 
        {
            Thread.sleep(1000);
        }catch (InterruptedException e) {} 
        //To check page ready state.

        if (js.executeScript("return document.readyState").toString().equals("complete"))
        { 
            break; 
        }   
      }
 }

1

নোডেজে আপনি প্রতিশ্রুতির মাধ্যমে এটি পেতে পারেন ...

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

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) → তারপরযোগ্য

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

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

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


1

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

কিছু অনুসন্ধানের পরে আমি ওবে টেস্টিং ছাগলের একটি পোস্ট পেয়েছি , যা এই সমস্যার সমাধান রয়েছে। এই সমাধানের জন্য সি # কোডটি এরকম কিছু:

 IWebElement page = null;
 ...
 public void WaitForPageLoad()
 {
    if (page != null)
    {
       var waitForCurrentPageToStale = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
       waitForCurrentPageToStale.Until(ExpectedConditions.StalenessOf(page));
    }

    var waitForDocumentReady = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    waitForDocumentReady.Until((wdriver) => (driver as IJavaScriptExecutor).ExecuteScript("return document.readyState").Equals("complete"));

    page = driver.FindElement(By.TagName("html"));

}

। আমি ড্রাইভার.নভিগেট.gotourl এর পরে সরাসরি এই পদ্ধতিটি চালিত করি, যাতে এটি পৃষ্ঠার যত তাড়াতাড়ি সম্ভব একটি রেফারেন্স পায়। এটি দিয়ে মজা করুন!


1

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

public boolean waitForJSandJQueryToLoad() {
    WebDriverWait wait = new WebDriverWait(webDriver, 30);
    // wait for jQuery to load
    ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        try {
            Long r = (Long)((JavascriptExecutor)driver).executeScript("return $.active");
            return r == 0;
        } catch (Exception e) {
            LOG.info("no jquery present");
            return true;
        }
      }
    };

    // wait for Javascript to load
    ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        return ((JavascriptExecutor)driver).executeScript("return document.readyState")
        .toString().equals("complete");
      }
    };

  return wait.until(jQueryLoad) && wait.until(jsLoad);
}

if $.active == 0তাই কোনও সক্রিয় এক্সএইচআরএস কল নেই (এটি কেবল jQuery নিয়ে কাজ করে)। জাভাস্ক্রিপ্ট আজাক্স কলের জন্য আপনাকে আপনার প্রকল্পে একটি পরিবর্তনশীল তৈরি করতে হবে এবং তা অনুকরণ করতে হবে।


0

এটি পরিচালনা করতে আপনি কিছু যুক্তি লিখতে পারেন। আমি একটি পদ্ধতি লিখেছি যা প্রত্যাবর্তন করবে WebElementএবং এই পদ্ধতিটি তিনবার বলা হবে বা আপনি সময় বাড়িয়ে নাল চেক যোগ করতে পারেন WebElementএখানে একটি উদাহরণ

public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.crowdanalytix.com/#home");
        WebElement webElement = getWebElement(driver, "homekkkkkkkkkkkk");
        int i = 1;
        while (webElement == null && i < 4) {
            webElement = getWebElement(driver, "homessssssssssss");
            System.out.println("calling");
            i++;
        }
        System.out.println(webElement.getTagName());
        System.out.println("End");
        driver.close();
    }

    public static WebElement getWebElement(WebDriver driver, String id) {
        WebElement myDynamicElement = null;
        try {
            myDynamicElement = (new WebDriverWait(driver, 10))
                    .until(ExpectedConditions.presenceOfElementLocated(By
                            .id(id)));
            return myDynamicElement;
        } catch (TimeoutException ex) {
            return null;
        }
    }

0

দস্তাবেজ প্রস্তুত আছে কিনা তা পরীক্ষা করতে আমি জাভাস্ক্রিপ্ট কোড কার্যকর করেছি। ক্লায়েন্ট সাইড রেন্ডারিং রয়েছে এমন সাইটগুলির জন্য আমাকে অনেক সময় ডিবাগিং সেলেনিয়াম পরীক্ষা বাঁচিয়েছে।

public static boolean waitUntilDOMIsReady(WebDriver driver) {
def maxSeconds = DEFAULT_WAIT_SECONDS * 10
for (count in 1..maxSeconds) {
    Thread.sleep(100)
    def ready = isDOMReady(driver);
    if (ready) {
        break;
    }
}

}

public static boolean isDOMReady(WebDriver driver){
    return driver.executeScript("return document.readyState");
}

0
public boolean waitForElement(String zoneName, String element, int index, int timeout) {
        WebDriverWait wait = new WebDriverWait(appiumDriver, timeout/1000);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element)));
        return true;
    }

0

রুবানভ যেমন সি # এর জন্য লিখেছিলেন, আমি এটি জাভার পক্ষে লিখি, এবং এটি হ'ল:

    public void waitForPageLoaded() {
    ExpectedCondition<Boolean> expectation = new
            ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return (((JavascriptExecutor) driver).executeScript("return document.readyState").toString().equals("complete")&&((Boolean)((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")));
                }
            };
    try {
        Thread.sleep(100);
        WebDriverWait waitForLoad = new WebDriverWait(driver, 30);
        waitForLoad.until(expectation);
    } catch (Throwable error) {
        Assert.fail("Timeout waiting for Page Load Request to complete.");
    }
}

0

জাভাতে এটি নীচে পছন্দ করবে: -

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

1
জেএস কমান্ডগুলিকে একের সাথে একত্রিত করা আরও ভাল হবে যাতে আপনার পৃষ্ঠাটি দুবার আঘাত করতে না হয়, যেমনreturn document.readyState == 'loaded' || return document.readyState == 'complete'
জেফসি

0

নিম্নলিখিত কোডটি সম্ভবত কাজ করা উচিত:

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfAllElementsLocated(By.xpath("//*")));

0

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


-1
public void waitForPageToLoad()
  {
(new WebDriverWait(driver, DEFAULT_WAIT_TIME)).until(new ExpectedCondition<Boolean>() {
      public Boolean apply(WebDriver d) {
        return (((org.openqa.selenium.JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete"));
      }
    });//Here DEFAULT_WAIT_TIME is a integer correspond to wait time in seconds

-1

এখানে রুবিতে অনুরূপ কিছু রয়েছে:

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

আপনার কোড আমার পক্ষে কাজ করে না। আমি কীভাবে iframe করতে পারি এবং অনলোড = "জাভাস্ক্রিপ্ট: পেজলোড (); ফাংশনালপেজলুড (); পৃষ্ঠাটি পুনরায় লোড করতে? আমি নিজেকে কোনও পৃষ্ঠার ভিতরে আইফ্রেম খুলতে দেখি, এতে আমার অ্যাক্সেস রয়েছে, পৃষ্ঠাটি পুনরায় লোড হয় এবং আমি আর ফ্রেমে অ্যাক্সেস করতে পারি না। আমি অপেক্ষা, ঘুম, সময়, ফ্রেমে স্যুইচ করে তারপরে পিতামাতার কাছে অনেকগুলি উত্তর পড়েছি, তবে আমি আমার লক্ষ্যে পৌঁছতে পারি না।
আমন্ডা কাভাল্লারো

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

-1

পৃষ্ঠাটি পুনরায় লোড না হওয়া পর্যন্ত আপনি থ্রেড স্লিপ করতে পারেন। এটি সেরা সমাধান নয়, কারণ পৃষ্ঠাটি লোড হতে কতক্ষণ সময় নেয় তার একটি অনুমানের আপনার থাকা দরকার।

driver.get(homeUrl); 
Thread.sleep(5000);
driver.findElement(By.xpath("Your_Xpath_here")).sendKeys(userName);
driver.findElement(By.xpath("Your_Xpath_here")).sendKeys(passWord);
driver.findElement(By.xpath("Your_Xpath_here")).click();

আমি থ্রেড.স্লিপ (5000) প্রায়শই একমাত্র পদ্ধতি যা ব্যবহারের বিরুদ্ধে সমস্ত প্রস্তাবনা সত্ত্বেও পরীক্ষামূলকভাবে কাজ করে। উপাদানটির জন্য অপেক্ষা করার কোনও মিশ্রণ আমার পক্ষে কাজ করে না, বিশেষত যতগুলি উপাদানগুলিকে প্রকৃতপক্ষে সন্ধান না করা হয় ততক্ষণ সনাক্ত করা যায় না।
স্টিভ স্ট্যাপল

-1

আমি পৃষ্ঠা লোড সম্পূর্ণ পরীক্ষা করেছি, সেলেনিয়াম 3.14.0 এ কাজ করি

    public static void UntilPageLoadComplete(IWebDriver driver, long timeoutInSeconds)
    {
        Until(driver, (d) =>
        {
            Boolean isPageLoaded = (Boolean)((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete");
            if (!isPageLoaded) Console.WriteLine("Document is loading");
            return isPageLoaded;
        }, timeoutInSeconds);
    }

    public static void Until(IWebDriver driver, Func<IWebDriver, Boolean> waitCondition, long timeoutInSeconds)
    {
        WebDriverWait webDriverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
        webDriverWait.Timeout = TimeSpan.FromSeconds(timeoutInSeconds);
        try
        {
            webDriverWait.Until(waitCondition);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

-1

এমন লোকদের জন্য যাদের দেখাতে নির্দিষ্ট উপাদানগুলির জন্য অপেক্ষা করতে হবে। (ব্যবহৃত সি #)

public static void WaitForElement(IWebDriver driver, By element)
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
    wait.Until(ExpectedConditions.ElementIsVisible(element));
}

তারপরে আপনি যদি উদাহরণের জন্য অপেক্ষা করতে চান তবে ডোমটিতে কোনও শ্রেণি = "ত্রুটি-বার্তা" উপস্থিত থাকলে আপনি কেবল:

WaitForElement(driver, By.ClassName("error-message"));

আইডি এর জন্য, এটি তখন হবে

WaitForElement(driver, By.Id("yourid"));


-3

আপনি কৌণিক ব্যবহার করছেন? আপনি যদি হন তবে এটি সম্ভব যে ওয়েবড্রাইভার অ্যাসিঙ্ক কল শেষ হয়ে গেছে তা স্বীকৃতি দেয় না।

আমি পল হ্যাম্যান্টস এনজিওড্রাইভারকে দেখার পরামর্শ দিই । ওয়েটারফোরআঙ্গুলারিক্যোস্টেসফটফিনিশ () পদ্ধতিটি কাজে লাগতে পারে।


তিনি খুব বেশি অ্যাঙ্গুলার ব্যবহার করছিলেন না। এই উত্তরটি নিম্নচঞ্চিত হয়েছিল কারণ মনে হয় আপনি মূল প্রশ্নটি যত্ন সহকারে পড়েন নি।
জেলসপ

তবে ভোটগুলি আপনাকে আকারের বাইরে বাঁকতে দেবে না। এখানকার লোকেরা ভাল বোঝায়। এবং সমালোচনা আসলে প্রেমের এক রূপ (কারণ কেউ যদি কাউকে সংশোধন করতে সময় নেয় তবে তাদের যত্নের কারণেই)। চেকআউট কীভাবে প্রশ্নগুলি স্মার্ট উপায়ে জিজ্ঞাসা করবেন - সেই ধারণাগুলি স্মার্ট উপায়ে প্রশ্নের উত্তর দেওয়ার ক্ষেত্রেও প্রযোজ্য।
জেলস্প
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.