Selenium c # Webdriver: รอจนกระทั่งมีองค์ประกอบอยู่


185

ฉันต้องการตรวจสอบให้แน่ใจว่ามีองค์ประกอบอยู่ก่อนที่ webdriver จะเริ่มทำสิ่งต่างๆ

ฉันกำลังพยายามทำให้สิ่งนี้เป็นจริง:

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

ฉันส่วนใหญ่ดิ้นรนวิธีการตั้งค่าฟังก์ชั่น anynomous ..


3
FYI - การสร้างช่วงเวลาของคุณเป็นแบบนี้TimeSpan.FromSeconds(5)ดีกว่า มันทำให้ IMO ชัดเจนยิ่งขึ้น
Kolob Canyon

คำตอบ:


159

หรือคุณสามารถใช้การรอโดยนัย:

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

การรอโดยปริยายคือการบอกให้ WebDriver ทำการสำรวจความคิดเห็นของ DOM ในช่วงระยะเวลาหนึ่งเมื่อพยายามค้นหาองค์ประกอบหรือองค์ประกอบหากไม่สามารถใช้งานได้ทันที การตั้งค่าเริ่มต้นคือ 0 เมื่อตั้งค่าแล้วการรอโดยนัยจะถูกกำหนดไว้สำหรับอายุการใช้งานของอินสแตนซ์วัตถุ WebDriver


5
ขอบคุณไวยากรณ์ใหม่คือ: driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);
Reda

20
@RedaBalkouch ไวยากรณ์ที่ Mike ใช้ในตอบถูกต้อง It's C #
Diemo

3
หากคุณเลือกใช้การรอโดยนัยโปรดระวังอย่าใช้การรออย่างชัดเจน ซึ่งอาจทำให้เกิดพฤติกรรมที่คาดเดาไม่ได้ซึ่งนำไปสู่ผลการทดสอบที่ไม่ดี โดยทั่วไปฉันขอแนะนำให้ใช้การรออย่างชัดเจนมากกว่าการรอโดยนัย
mrfreester

7
วิธีนี้เลิกใช้แล้วคุณควรใช้คุณสมบัติ ImplicitWait แทน:Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
Samuel Rondeau-Millaire

1
ฉันใช้วิธีการที่จัดเตรียมไว้และพบว่าวิธีนั้นเลิกใช้แล้วตามที่ซามูเอลชี้ให้เห็น การตรวจสอบการมีอยู่ของรายการจะรอจนถึงเวลาที่ระบุ
Jim Scott

279

การใช้โซลูชันที่ Mike Kwan จัดหาให้อาจมีผลกระทบต่อประสิทธิภาพการทดสอบโดยรวมเนื่องจากการรอโดยนัยจะถูกใช้ในการโทร FindElement ทั้งหมด หลายครั้งที่คุณต้องการให้ FindElement ล้มเหลวทันทีที่ไม่มีองค์ประกอบ (คุณกำลังทดสอบหน้าผิดรูปแบบองค์ประกอบที่ขาดหายไป ฯลฯ ) ด้วยการรอการดำเนินการเหล่านี้จะรอให้หมดเวลาทั้งหมดก่อนที่จะหมดเวลาก่อนที่จะทำการยกเว้น การรอปริยายเริ่มต้นถูกตั้งค่าเป็น 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 เนื่องจากการสร้างมันราคาถูกมากส่วนขยายนี้อาจใช้พร้อมกันสำหรับวัตถุ WebDriver ที่แตกต่างกันและฉันจะทำการปรับให้เหมาะสมที่สุดเมื่อต้องการในที่สุด

การใช้งานตรงไปตรงมา:

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

114
ในกรณีที่มีคนสงสัยว่าWebDriverWaitมาจากOpenQA.Selenium.Support.UInamespace และมาในแพ็คเกจแยกต่างหากที่เรียกว่าSelenium WebDriver Support ClassesNuGet
Andy

5
@Ved ฉันสามารถจูบคุณ <3 ได้รับการมองหามันใน dll ที่แตกต่างกัน: D
Adween

1
@Loudenvier โปรดทำให้บรรทัดแรกเป็นตัวหนาเพื่อให้ชัดเจนยิ่งขึ้น โดยเฉพาะอย่างยิ่งเนื่องจากไม่ใช่คำตอบที่ยอมรับแม้ว่าจะเป็นวิธีการที่ดีกว่าและแม่นยำกว่า
Rick

5
Selenium WebDriver Support Classesตอนนี้ปรากฏบน NuGet เป็น"Selenium.Support"รุ่นปัจจุบันคือ 3.4.0
Eric F.

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
ขณะนี้ใช้งานได้ ตอนนี้ถูกทำเครื่องหมายว่าเลิกใช้แล้วดังนั้นควรหลีกเลี่ยง
Adam Garner

3
นี่คือวิธีการใหม่ (ไม่เลิกใช้): stackoverflow.com/a/49867605/331281
Dejan

1
โปรดทราบว่าในเวลานี้เครื่องหมายDotNetSeleniumExtras.WaitHelpers(ที่อ้างถึงโดย @Dejan ด้านบน) "ไม่ได้รับการแก้ไขปัญหาจะไม่ได้รับการแก้ไข PR จะไม่ได้รับการยอมรับ" (ที่มา: github.com/SeleniumHQ/selenium/issues/… ) สำนักพิมพ์ของมันกำลังมองหาผู้ดูแลที่จะรับช่วงต่อจากเขา
urig

30

ต่อไปนี้เป็นรูปแบบของโซลูชัน @ Loudenvier ที่ใช้งานได้หลายองค์ประกอบ:

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
ดี! ฉันเพิ่งเพิ่มสิ่งนี้ไปยังห้องสมุดของฉัน! นั่นคือความสวยงามของการแบ่งปันรหัส !!!
Loudenvier

1
ฉันขอแนะนำนอกจากนี้ คุณสามารถตรวจจับโซลูชัน NoSuchElement และส่งคืนค่าว่างในอินสแตนซ์นั้น จากนั้นคุณสามารถสร้างวิธีส่วนขยายที่เรียกว่า .exists ที่ส่งกลับค่าจริงเว้นแต่ IWebElement เป็นโมฆะ
Brantley Blanchard

17

แรงบันดาลใจจากโซลูชั่นของ Loudenvier นี่คือวิธีการขยายที่ใช้งานได้กับวัตถุ ISearchContext ทั้งหมดไม่ใช่แค่ IWebDriver ซึ่งเป็นความเชี่ยวชาญเฉพาะของอดีต วิธีนี้ยังรองรับการรอจนกว่าองค์ประกอบจะปรากฏขึ้น

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);นั้นจะยังคงเป็นการดีที่ค่าการหมดเวลาที่คุณตั้งไว้ที่นี่
howcheng

ดูเหมือนจะไม่เหมาะกับฉัน ... ? ฉันเพิ่มStopwatchรอบการเรียกร้องให้วิธีขยายและภายในแลมบ์ดาที่ส่งไปยังConsole.WriteLine() Until()นาฬิกาจับเวลาวัดเกือบตรง 60 Consoleวินาทีและมีเพียงหนึ่งข้อความถูกเขียนขึ้นเพื่อ ฉันทำอะไรบางอย่างหายไปหรือเปล่า
urig

10

ฉันสับสนฟังก์ชั่นที่ผิดปกติกับภาคแสดง นี่เป็นวิธีการช่วยเหลือเล็กน้อย:

   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

คุณสามารถค้นหาบางสิ่งเช่นนี้ใน C #

นี่คือสิ่งที่ฉันใช้ใน JUnit - Selenium

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

ทำการนำเข้าแพ็คเกจที่เกี่ยวข้อง


1
ฉันพยายามที่จะใช้สิ่งนี้ในวันนี้และ VS.net ให้คำเตือนแก่ฉัน: OpenQA.Selenium.Support.UI.ExpectedConditions คลาสได้รับการทำเครื่องหมายว่า "เลิกใช้แล้ว" และ "ย้ายไปยัง DotNetSeleniumExtras" repo บนgithub.com/DotNetSeleniumTools
Jeff 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;
     }
}

รหัสข้างต้นคือการตรวจสอบว่าองค์ประกอบเฉพาะมีอยู่หรือไม่
Madhu

2

คำสั่ง clickAndWait จะไม่ถูกแปลงเมื่อคุณเลือกรูปแบบ Webdriver ใน Selenium IDE นี่คือวิธีแก้ปัญหา เพิ่มบรรทัดรอด้านล่าง ปัญหาที่เกิดขึ้นจริงคือการคลิกหรือเหตุการณ์ที่เกิดขึ้นก่อนหนึ่งบรรทัด 1 ในรหัส C # ของฉัน แต่จริงๆให้แน่ใจว่าคุณมี WaitForElement ก่อนการดำเนินการใด ๆ ที่คุณอ้างอิงถึงวัตถุ "By"

รหัส HTML:

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

รหัส C # / NUnit:

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

จาก EC คุณสามารถเลือกเงื่อนไขอื่น ๆ ได้เช่นกันลอง: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions


คำถามนี้ถูกแท็ก C # ไม่ใช่ Python คำตอบนี้ไม่เกี่ยวข้อง
ผู้ใช้

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

ใช้ Rn222 และ Aknuds1 เพื่อใช้ ISearchContext ที่ส่งกลับองค์ประกอบเดียวหรือรายการ และสามารถระบุจำนวนองค์ประกอบขั้นต่ำได้:

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

คุณไม่ต้องการรอนานเกินไปก่อนที่องค์ประกอบจะเปลี่ยนแปลง ในรหัสนี้ webdriver รอนานถึง 2 วินาทีก่อนที่มันจะดำเนินต่อไป

WebDriverWait wait = ใหม่ WebDriverWait (ไดรเวอร์, TimeSpan.FromMilliseconds (2000));
wait.Until (ExpectedConditions.VisibilityOfAllElementsLocatedBy (By.Name ( "html ที่ชื่อ")));


1

เนื่องจากฉันกำลังแยกนิยามองค์ประกอบของหน้าเว็บและสถานการณ์การทดสอบหน้าเว็บโดยใช้ IWebElement ที่พบแล้วสำหรับการมองเห็นสามารถทำได้ดังนี้:

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

นี่คือฟังก์ชั่นที่ใช้ซ้ำได้เพื่อรอองค์ประกอบที่มีอยู่ใน DOM โดยใช้ Wait Wait

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

ยินดีต้อนรับสู่ Stack Overflow โปรดอย่าโพสต์คำตอบเฉพาะรหัสเท่านั้น
JJ เพื่อความโปร่งใสและโมนิก้า

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งานได้ แต่ฉันไม่ได้ลอง มันเป็นทางการ แต่ถูกแยกออกเป็นแพ็คเกจนักเก็ตอื่น คุณสามารถดูC # ซีลีเนียม 'ExpectedConditions เป็นล้าสมัย'

ตัวเองกำลังใช้งาน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

ฉันเห็นโซลูชันหลายรายการที่โพสต์แล้วทำงานได้ดี! อย่างไรก็ตามในกรณีที่ทุกคนต้องการสิ่งอื่นฉันคิดว่าฉันจะโพสต์สองวิธีที่ฉันใช้ในซีลีเนียม C # เป็นการส่วนตัวเพื่อทดสอบว่ามีองค์ประกอบอยู่หรือไม่! หวังว่ามันจะช่วยไชโย!

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
 new WebDriverWait(driver, TimeSpan.FromSeconds(10)).
   Until(ExpectedConditions.PresenceOfAllElementsLocatedBy((By.Id("toast-container"))));

ExpectedConditions เลิกใช้แล้ว
GELR

-1

คำตอบแรกดีปัญหาของฉันคือข้อยกเว้นที่ไม่สามารถจัดการได้ไม่ได้ปิดเว็บไดรเวอร์อย่างถูกต้องและเก็บค่าแรกที่ฉันเคยใช้ซึ่งก็คือ 1 วินาที

หากคุณได้รับปัญหาเดียวกัน

restart you visual studioและรับรองว่าall the exceptions are handledเหมาะสม


ถึงตอนนี้คุณควรรู้ว่าไม่มีคำสั่งให้ตอบใน Stack Overflow ดังนั้นจึงไม่มี "คำตอบแรก"
Antti Haapala

-2

กำลังค้นหาวิธีที่จะรอใน Selenium สำหรับสภาพที่ดินในหัวข้อนี้และนี่คือสิ่งที่ฉันใช้ตอนนี้:

    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.