সেলেনিয়াম সি # ওয়েবড্রাইভার: এলিমেন্ট উপস্থিত না হওয়া পর্যন্ত অপেক্ষা করুন


185

আমি এটি নিশ্চিত করতে চাই যে ওয়েবড্রাইভার স্টাফ করা শুরু করার আগে কোনও উপাদান উপস্থিত রয়েছে।

আমি কাজ করার জন্য এই জাতীয় কিছু পাওয়ার চেষ্টা করছি:

WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));

আমি মূলত যেভাবে কোনও অসাধারণ কাজটি সেট আপ করতে পারি তা সংগ্রাম করছি


3
অবগতির জন্য - এটা ক্লিনার এই মত আপনার timespan গড়ে তুলতে এর TimeSpan.FromSeconds(5)। এটি আরও স্পষ্ট করে তোলে আইএমও
কলব ক্যানিয়ন

উত্তর:


159

বিকল্পভাবে আপনি অন্তর্নিহিত অপেক্ষারত ব্যবহার করতে পারেন:

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

একটি অন্তর্নিহিত অপেক্ষা হ'ল ওয়েবড্রাইভারকে কোনও উপাদান বা উপাদানগুলি যদি তাত্ক্ষণিকভাবে উপলব্ধ না হয় তবে সন্ধানের জন্য নির্দিষ্ট সময়ের জন্য ডমকে পোল করতে বলুন। ডিফল্ট সেটিংটি 0. হয় set


5
ধন্যবাদ, নতুন সিনট্যাক্সটি হ'ল: ড্রাইভার.ম্যানেজ ()। সময়সীমা ()। প্রকটভাবে ওয়েইট (10, টাইমউনিট.এসসিএনডিএস);
রেদা

20
@ রেদাবালকউচ, তার উত্তরে ব্যবহৃত সিনট্যাক্স মাইক সঠিক। এটি সি #
ডায়মো

3
আপনি যদি অন্তর্নিহিত অপেক্ষাগুলি ব্যবহার করতে চান, তবে স্পষ্টভাবে অপেক্ষাগুলি ব্যবহার না করার বিষয়ে সতর্ক হন। যা খারাপ পরীক্ষা ফলাফলের দিকে পরিচালিত করে কিছু অবিশ্বাস্য আচরণের কারণ হতে পারে। সাধারণভাবে বলতে গেলে, আমি অন্তর্নিহিত অপেক্ষাগুলির জন্য সুস্পষ্ট অপেক্ষাগুলি ব্যবহার করার পরামর্শ দেব।
mrfreeter

7
এই পদ্ধতি এখন নিন্দা করা হয়েছে, আপনি যদি এর পরিবর্তে সম্পত্তি ImplicitWait ব্যবহার করা উচিত:Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
স্যামুয়েল ছন্দের পদবিশেষ-Millaire

1
আমি প্রদত্ত পদ্ধতির ব্যবহার করেছি এবং স্যামুয়েল দ্বারা নির্দেশিত হিসাবে পদ্ধতিটি হ্রাস পেয়েছে found কোনও আইটেমের অস্তিত্বের জন্য অনুসন্ধান করা এখন নির্দিষ্ট সময়ের অপেক্ষা করে।
জিম স্কট

279

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

IWebDriver এ আমি একটি সামান্য এক্সটেনশন পদ্ধতি লিখেছি যা পদ্ধতিতে একটি সময়সীমা (সেকেন্ডে) প্যারামিটার যুক্ত করে FindElement()। এটি বেশ স্ব-ব্যাখ্যামূলক:

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

আমি WebDriverWait অবজেক্টটি ক্যাশে করিনি কারণ এটির নির্মাণ খুব সস্তা, এই এক্সটেনশনটি একই সাথে বিভিন্ন ওয়েবড্রাইভার অবজেক্টের জন্য ব্যবহৃত হতে পারে এবং শেষ পর্যন্ত যখন প্রয়োজন হয় তখন আমি কেবল অপ্টিমাইজেশন করি।

ব্যবহার সোজা-এগিয়ে:

var driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://localhost/mypage");
var btn = driver.FindElement(By.CssSelector("#login_button"));
btn.Click();
var employeeLabel = driver.FindElement(By.CssSelector("#VCC_VSL"), 10);
Assert.AreEqual("Employee", employeeLabel.Text);
driver.Close();

113
যদি কেউ অবাক হন, নামস্থান WebDriverWaitথেকে OpenQA.Selenium.Support.UIএসেছেন এবং Selenium WebDriver Support Classesনিউগেট
এন্ডি

5
@ আমি আপনাকে চুম্বন করতে পারি <3 এটি আলাদা
ডিলে

1
@ লাউডেনভিয়ার দয়া করে প্রথম লাইনটি সাহসী করুন যাতে এটি আরও লক্ষণীয় হয়। বিশেষত যেহেতু এটি গৃহীত উত্তর নয়, যদিও এটি আরও ভাল এবং আরও সুনির্দিষ্ট পদ্ধতির হয়ে থাকে।
রিক

5
Selenium WebDriver Support Classesএখন নিউগেটে "সেলেনিয়াম.সপোর্ট" হিসাবে উপস্থিত হয়েছে , বর্তমান সংস্করণটি 3.4.0
এরিক এফ।

1
আমি এই লাইনটি ব্যবহার না করা অবধি আমার এখনও অনেক ত্রুটি ছিল return wait.Until(ExpectedConditions.ElementToBeClickable(by));এবং এটি এখন দুর্দান্ত কাজ করে। অন্য কেউ এলোমেলোভাবে উপাদানগুলি পাওয়া যায় নি সেই বিষয়ে শীর্ষস্থানীয়।
প্রসপেক্টর

84

আপনি ব্যবহার করতে পারেন

ExpectedConditions.ElementExists

সুতরাং আপনি যে জাতীয় উপাদান উপলব্ধতার জন্য অনুসন্ধান করবে

new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut)).Until(ExpectedConditions.ElementExists((By.Id(login))));

উৎস


1
সম্মতি জানানো হয়েছে, এটি নিছক সময়সীমার চেয়ে অনেক বেশি কার্যকর (আপনি যখন কোনও বস্তু গতিশীলভাবে লোড করছেন) এমন ক্ষেত্রে।
keithl8041

5
এই কাজ করে। এটি এখন অবচয় হিসাবে চিহ্নিত হয়েছে, তাই এড়ানো উচিত।
অ্যাডাম গারনার

3
এখানে নতুন পদ্ধতিটি ( অবহেলিত
দেজন

1
দ্রষ্টব্য, এই মুহুর্তে, DotNetSeleniumExtras.WaitHelpers(উপরে @ ডিজন দ্বারা উল্লিখিত) "রক্ষণাবেক্ষণ করা হয় না, সমস্যাগুলি স্থির করা হবে না, জনগণ গৃহীত হবে না"। (উত্স: github.com/SeleniumHQ/selenium/issues/… )। এটির প্রকাশক তার কাছ থেকে এটি নেওয়ার জন্য একজন রক্ষণাবেক্ষণকারীকে খুঁজছেন।
urig

30

এখানে @ লাউডেনভিয়ারের সমাধানের বিভিন্নতা যা একাধিক উপাদান পাওয়ার জন্যও কাজ করে:

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

    public static ReadOnlyCollection<IWebElement> FindElements(this IWebDriver driver, By by, int timeoutInSeconds)
    {
        if (timeoutInSeconds > 0)
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => (drv.FindElements(by).Count > 0) ? drv.FindElements(by) : null);
        }
        return driver.FindElements(by);
    }
}

7
নিস! আমি এটিকে কেবল নিজের লাইব্রেরিতে যুক্ত করেছি! এটাই শেয়ারিং কোডের সৌন্দর্য !!!
লাউডেনভিয়ার

1
আমি এটিতে একটি যুক্ত করার পরামর্শ দেব। আপনি NoSuchElement সমাধানটি ধরতে পারেন এবং সেই পরিস্থিতিতে শূন্য হয়ে যেতে পারেন। তারপরে আপনি .exists নামক একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন যা IWebElement নਾਲ না হলে সত্য প্রত্যাবর্তন করে।
ব্রান্টলে ব্ল্যানচার্ড

17

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

static class WebDriverExtensions
{
    /// <summary>
    /// Find an element, waiting until a timeout is reached if necessary.
    /// </summary>
    /// <param name="context">The search context.</param>
    /// <param name="by">Method to find elements.</param>
    /// <param name="timeout">How many seconds to wait.</param>
    /// <param name="displayed">Require the element to be displayed?</param>
    /// <returns>The found element.</returns>
    public static IWebElement FindElement(this ISearchContext context, By by, uint timeout, bool displayed=false)
    {
        var wait = new DefaultWait<ISearchContext>(context);
        wait.Timeout = TimeSpan.FromSeconds(timeout);
        wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
        return wait.Until(ctx => {
            var elem = ctx.FindElement(by);
            if (displayed && !elem.Displayed)
                return null;

            return elem;
        });
    }
}

ব্যবহারের উদাহরণ:

var driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://localhost");
var main = driver.FindElement(By.Id("main"));
var btn = main.FindElement(By.Id("button"));
btn.Click();
var dialog = main.FindElement(By.Id("dialog"), 5, displayed: true);
Assert.AreEqual("My Dialog", dialog.Text);
driver.Close();

1
যদি আপনি একটি অন্তর্নিহিত অপেক্ষাকে সেট করে থাকেন _webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);তবে তা এখানে নির্ধারিত সময়সীমার মানকে ট্রাম্প করবে।
হাওচেং

এটা আমার জন্য কাজ করে না বলে মনে হচ্ছে ...? আমি Stopwatchএক্সটেনশন পদ্ধতিতে কলটির চারপাশে এবং Console.WriteLine()প্রেরিত ল্যাম্বডির অভ্যন্তরে যোগ করেছি Until()। স্টপওয়াচটি প্রায় 60 সেকেন্ড পরিমাপ করা হয়েছিল এবং কেবলমাত্র একটি বার্তা এতে লেখা হয়েছিল Console। আমি কি এখানে কিছু মিস করছি?
urig

10

আমি প্রিডিকেট দিয়ে যেকোনও কাজকে গুলিয়ে ফেললাম। Heres একটি সামান্য সহায়ক পদ্ধতি:

   WebDriverWait wait;
    private void waitForById(string id) 
    {
        if (wait == null)            
            wait = new WebDriverWait(driver, new TimeSpan(0,0,5));

        //wait.Until(driver);
        wait.Until(d => d.FindElement(By.Id(id)));
    }

5

আপনি সি # তে এর মতো কিছু সন্ধান করতে পারেন।

এটি আমি জুনিত - সেলেনিয়ামে ব্যবহার করেছি

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

আমদানি সম্পর্কিত প্যাকেজগুলি করুন


1
আমি ও আজ ব্যবহার করার প্রচেষ্টা করেছে VS.net আমাকে সতর্কবার্তা প্রদান করা হয়: OpenQA.Selenium.Support.UI.ExpectedConditions বর্গ চিহ্নিত হয়েছে "অসমর্থিত" থাকা এবং চালু রেপো "DotNetSeleniumExtras চলে আসেন" ছিল github.com/DotNetSeleniumTools
জেফ Mergler

3
//wait up to 5 seconds with no minimum for a UI element to be found
WebDriverWait wait = new WebDriverWait(_pagedriver, TimeSpan.FromSeconds(5));
IWebElement title = wait.Until<IWebElement>((d) =>
{
    return d.FindElement(By.ClassName("MainContentHeader"));
});

3
public bool doesWebElementExist(string linkexist)
{
     try
     {
        driver.FindElement(By.XPath(linkexist));
        return true;
     }
     catch (NoSuchElementException e)
     {
        return false;
     }
}

উপরের কোডটি নির্দিষ্ট উপাদান উপস্থিত রয়েছে কিনা তা যাচাই করে দেখানো হবে।
মধু

2

আপনি যখন সেলেনিয়াম আইডিইতে ওয়েবড্রাইভার ফর্ম্যাটটি চয়ন করেন তখন ক্লিক অ্যান্ড ওয়েইট কমান্ড রূপান্তরিত হয় না। এখানে কর্মক্ষেত্র আছে। নীচে অপেক্ষা লাইন যুক্ত করুন। বাস্তবে, সমস্যাটি ছিল আমার সি # কোডের 1 - লাইন 1 এর আগে ঘটে যাওয়া ক্লিক বা ইভেন্ট। তবে সত্যই, নিশ্চিত হয়ে নিন যে কোনও পদক্ষেপের আগে আপনি "বাই" অবজেক্টটি উল্লেখ করছেন সেখানে কোনও অপেক্ষার আগে আপনার ওয়েটফরমেন্ট রয়েছে lement

এইচটিএমএল কোড:

<a href="http://www.google.com">xxxxx</a>

সি # / ননিট কোড:

driver.FindElement(By.LinkText("z")).Click;
driver.WaitForElement(By.LinkText("xxxxx"));
driver.FindElement(By.LinkText("xxxxx")).Click();

2

পাইথন:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

driver.find_element_by_id('someId').click()

WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.ID, 'someAnotherId'))

ইসি থেকে অন্যান্য শর্ত নির্বাচন করতে পারবেন ভাল হিসাবে এই চেষ্টা করে দেখুন: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions


এই প্রশ্নটি সি # ট্যাগ করেছে, পাইথন নয়। এই উত্তরটি অপ্রাসঙ্গিক।
ব্যবহারকারী

2

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

 New WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(Function(d) d.FindElement(By.Id("controlName")).Displayed)

4
আপনার কী করা উচিত এবং কেন এটি সমস্যার সমাধান করে তা আপনার ব্যাখ্যা করা উচিত। এবং দয়া করে আপনার কোডটি ফর্ম্যাট করুন।
Hering

1

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

public static  WebDriverWait wait = new WebDriverWait(driver, 60);

উদাহরণ:

wait.until(ExpectedConditions.visibilityOfElementLocated(UiprofileCre.UiaddChangeUserLink));

1

আরএস 222 এবং আকনডস 1 ব্যবহার করেছেন এমন একটি অনুসন্ধান অনুসন্ধান কনটেক্সট যা কোনও একক উপাদান বা কোনও তালিকার প্রত্যাবর্তন করে। এবং ন্যূনতম সংখ্যক উপাদান নির্দিষ্ট করা যেতে পারে:

public static class SearchContextExtensions
{
    /// <summary>
    ///     Method that finds an element based on the search parameters within a specified timeout.
    /// </summary>
    /// <param name="context">The context where this is searched. Required for extension methods</param>
    /// <param name="by">The search parameters that are used to identify the element</param>
    /// <param name="timeOutInSeconds">The time that the tool should wait before throwing an exception</param>
    /// <returns> The first element found that matches the condition specified</returns>
    public static IWebElement FindElement(this ISearchContext context, By by, uint timeOutInSeconds)
    {
        if (timeOutInSeconds > 0)
        {
            var wait = new DefaultWait<ISearchContext>(context);
            wait.Timeout = TimeSpan.FromSeconds(timeOutInSeconds);
            return wait.Until<IWebElement>(ctx => ctx.FindElement(by));
        }
        return context.FindElement(by);
    }
    /// <summary>
    ///     Method that finds a list of elements based on the search parameters within a specified timeout.
    /// </summary>
    /// <param name="context">The context where this is searched. Required for extension methods</param>
    /// <param name="by">The search parameters that are used to identify the element</param>
    /// <param name="timeoutInSeconds">The time that the tool should wait before throwing an exception</param>
    /// <returns>A list of all the web elements that match the condition specified</returns>
    public static IReadOnlyCollection<IWebElement> FindElements(this ISearchContext context, By by, uint timeoutInSeconds)
    {

        if (timeoutInSeconds > 0)
        {
            var wait = new DefaultWait<ISearchContext>(context);
            wait.Timeout = TimeSpan.FromSeconds(timeoutInSeconds);
            return wait.Until<IReadOnlyCollection<IWebElement>>(ctx => ctx.FindElements(by));
        }
        return context.FindElements(by);
    }
    /// <summary>
    ///     Method that finds a list of elements with the minimum amount specified based on the search parameters within a specified timeout.<br/>
    /// </summary>
    /// <param name="context">The context where this is searched. Required for extension methods</param>
    /// <param name="by">The search parameters that are used to identify the element</param>
    /// <param name="timeoutInSeconds">The time that the tool should wait before throwing an exception</param>
    /// <param name="minNumberOfElements">
    ///     The minimum number of elements that should meet the criteria before returning the list <para/>
    ///     If this number is not met, an exception will be thrown and no elements will be returned
    ///     even if some did meet the criteria
    /// </param>
    /// <returns>A list of all the web elements that match the condition specified</returns>
    public static IReadOnlyCollection<IWebElement> FindElements(this ISearchContext context, By by, uint timeoutInSeconds, int minNumberOfElements)
    {
        var wait = new DefaultWait<ISearchContext>(context);
        if (timeoutInSeconds > 0)
        {
            wait.Timeout = TimeSpan.FromSeconds(timeoutInSeconds);
        }

        // Wait until the current context found the minimum number of elements. If not found after timeout, an exception is thrown
        wait.Until<bool>(ctx => ctx.FindElements(by).Count >= minNumberOfElements);

        //If the elements were successfuly found, just return the list
        return context.FindElements(by);
    }

}

ব্যবহারের উদাহরণ:

var driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://localhost");
var main = driver.FindElement(By.Id("main"));
// It can be now used to wait when using elements to search
var btn = main.FindElement(By.Id("button"),10);
btn.Click();
//This will wait up to 10 seconds until a button is found
var button = driver.FindElement(By.TagName("button"),10)
//This will wait up to 10 seconds until a button is found, and return all the buttons found
var buttonList = driver.FindElements(By.TagName("button"),10)
//This will wait for 10 seconds until we find at least 5 buttons
var buttonsMin= driver.FindElements(By.TagName("button"), 10, 5);
driver.Close();

1

উপাদান পরিবর্তনের আগে আপনি খুব বেশি সময় অপেক্ষা করতে চান না। এই কোডটিতে ওয়েবড্রাইভার এটি চালিয়ে যাওয়ার আগে 2 সেকেন্ড পর্যন্ত অপেক্ষা করে।

ওয়েবড্রাইভারওয়েট ওয়েট = নতুন ওয়েবড্রাইভারওয়েট (ড্রাইভার, টাইমস্প্যান।ফর্মমিলিসেকেন্ডস (2000));
wait.Until (ExpectedConditions.VisibilityOfAllElementsLocatedBy (By.Name ( "এইচটিএমএল-নাম")));


1

যেহেতু আমি দৃশ্যমানতার জন্য ইতিমধ্যে পাওয়া আইডাব্লিটমেন্ট ব্যবহার করে পৃষ্ঠা উপাদান সংজ্ঞা এবং পৃষ্ঠা পরীক্ষার পরিস্থিতিগুলি পৃথক করছি তা এইভাবে করা যেতে পারে:

public static void WaitForElementToBecomeVisibleWithinTimeout(IWebDriver driver, IWebElement element, int timeout)
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(timeout)).Until(ElementIsVisible(element));
}

private static Func<IWebDriver, bool> ElementIsVisible(IWebElement element)
{
    return driver => {
        try
        {
            return element.Displayed;              
        }
        catch(Exception)
        {
            // If element is null, stale or if it cannot be located
            return false;
        }
    };
}

1

সুস্পষ্ট অপেক্ষাটি ব্যবহার করে ডিওমে উপস্থিত কোনও উপাদানটির জন্য অপেক্ষা করা এটি পুনরায় ব্যবহারযোগ্য ফাংশন।

public void WaitForElement(IWebElement element, int timeout = 2)
{
    WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromMinutes(timeout));
    wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
    wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException));
    wait.Until<bool>(driver =>
    {
        try
        {
            return element.Displayed;
        }
        catch (Exception)
        {
            return false;
        }
    });
}

স্ট্যাক ওভারফ্লোতে স্বাগতম, দয়া করে কেবল কোড-উত্তরগুলি পোস্ট করবেন না।
স্বচ্ছতার জন্য জেজে এবং মনিকা

0

আমরা এটির মতো অর্জন করতে পারি:

public static IWebElement WaitForObject(IWebDriver DriverObj, By by, int TimeOut = 30)
{
    try
    {
        WebDriverWait Wait1 = new WebDriverWait(DriverObj, TimeSpan.FromSeconds(TimeOut));
        var WaitS = Wait1.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.PresenceOfAllElementsLocatedBy(by));
        return WaitS[0];
    }
    catch (NoSuchElementException)
    {
        Reports.TestStep("Wait for Element(s) with xPath was failed in current context page.");
        throw;
    }
}

0

WebDriverWait কার্যকর হবে না।

var driver = new FirefoxDriver(
    new FirefoxOptions().PageLoadStrategy = PageLoadStrategy.Eager
);
driver.Navigate().GoToUrl("xxx");
new WebDriverWait(driver, TimeSpan.FromSeconds(60))
    .Until(d => d.FindElement(By.Id("xxx"))); // a tag that close to the end

পৃষ্ঠাটি "ইন্টারেক্টিভ" হয়ে গেলে এটি তাত্ক্ষণিকভাবে একটি ব্যতিক্রম ছুঁড়ে ফেলবে। আমি জানি না কেন তবে সময়সীমা অস্তিত্বহীনভাবে কাজ করে।

সম্ভবত SeleniumExtras.WaitHelpersকাজ করে কিন্তু আমি চেষ্টা করিনি। এটি অফিসিয়াল তবে অন্য নুগেট প্যাকেজে বিভক্ত ছিল। আপনি সি # সেলেনিয়াম 'এক্সপেক্টেড কনডিশনগুলি অপ্রচলিত' উল্লেখ করতে পারেন ।

নিজে নিজে ব্যবহার করছেন FindElementsএবং তা Count == 0সত্য কিনা তা ব্যবহার করছেন কিনা তা যাচাই করে নিচ্ছেন await Task.Delay। এটি আসলেই বেশ দক্ষ নয়।


0

আপনি নিম্নলিখিত ব্যবহার করতে পারেন

WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(ExpectedConditions.ElementToBeClickable((By.Id("login")));

-1

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

public static class IsPresent
{
    public static bool isPresent(this IWebDriver driver, By bylocator)
    {

        bool variable = false;
        try
        {
            IWebElement element = driver.FindElement(bylocator);
            variable = element != null;
        }
       catch (NoSuchElementException){

       }
        return variable; 
    }

}

এখানে দ্বিতীয়

    public static class IsPresent2
{
    public static bool isPresent2(this IWebDriver driver, By bylocator)
    {
        bool variable = true; 
        try
        {
            IWebElement element = driver.FindElement(bylocator);

        }
        catch (NoSuchElementException)
        {
            variable = false; 
        }
        return variable; 
    }

}


-1

প্রথম উত্তরটি ভাল, আমার সমস্যাটি হ'ল আনহ্যান্ডেল ব্যতিক্রমগুলি সঠিকভাবে ওয়েব ড্রাইভারকে বন্ধ করেনি এবং এটি আমার ব্যবহৃত প্রথম মানটি রাখে যা 1 সেকেন্ড।

আপনি যদি একই সমস্যা পেতে

restart you visual studioএবং এটি all the exceptions are handledসঠিকভাবে নিশ্চিত করুন ।


এতক্ষণে আপনার জানা উচিত যে স্ট্যাক ওভারফ্লোতে উত্তর দেওয়ার কোনও অর্ডার নেই, সুতরাং কোনও "প্রথম উত্তর" নেই
অ্যান্টি হাপালা

-2

এই থ্রেডে অবতরণ করে কীভাবে শর্তের জন্য সেলেনিয়ামে অপেক্ষা করতে হবে তা সন্ধান করছিলাম এবং আমি এখন এটি ব্যবহার করছি:

    WebDriverWait wait = new WebDriverWait(m_driver, TimeSpan.FromSeconds(10));
    wait.Until(d => ReadCell(row, col) != "");

ReadCell(row, col) != ""যে কোনও শর্ত হতে পারে। এইভাবে পছন্দ করুন কারণ:

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