当前位置: 首页 > 知识库问答 >
问题:

如何让webDriver等待页面加载(C#Selenium项目)

耿玄裳
2023-03-14

我已经用C#启动了一个Selenium项目。试图等待页面完成加载,然后才进行下一个操作。

我的代码如下所示:

 loginPage.GoToLoginPage();
        loginPage.LoginAs(TestCase.Username, TestCase.Password);
        loginPage.SelectRole(TestCase.Orgunit);
        loginPage.AcceptRole();

在LoginPage.SelectRole(TestCase.orgUnit)中:

 RoleHierachyLabel = CommonsBasePage.Driver.FindElement(By.XPath("//span[contains(text(), " + role + ")]"));
 RoleHierachyLabel.Click();
 RoleLoginButton.Click();

我搜索元素RolehierachyLabel。我一直在尝试使用多种方法来等待页面加载或搜索允许一些超时的元素属性:

1. _browserInstance.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));
2. public static bool WaitUntilElementIsPresent(RemoteWebDriver driver, By by, int timeout = 5)
    {
        for (var i = 0; i < timeout; i++)
        {
            if (driver.ElementExists(by)) return true;
        }
        return false;
    }

你将如何解决这个障碍?

共有1个答案

田彬郁
2023-03-14

我一直在寻找替代方案,我已经决定使用以下版本。在第一种情况下,它们都使用带有定义超时的显式等待,并且基于元素属性,在第二种情况下基于元素的陈旧性。

第一个选择是检查元素属性,直到超时为止。我已经到了以下属性,这些属性确认它在页面上可用:

存在性--用于检查某个元素是否存在于页面的DOM中的期望。这并不一定意味着该元素是可见的。

//this will not wait for page to load
Assert.True(Driver.FindElement(By elementLocator).Enabled)

//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementExists(By elementLocator, int timeout = 10)
    {
        try
        {
            var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
            return wait.Until(ExpectedConditions.ElementExists(elementLocator));
        }
        catch (NoSuchElementException)
        {
            Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
            throw;
        }
    }
//this will not wait for page to load
Assert.True(Driver.FindElement(By elementLocator).Displayed)

//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementVisible(By elementLocator, int timeout = 10)
    {
        try
        {
            var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
            return wait.Until(ExpectedConditions.ElementIsVisible(elementLocator));
        }
        catch (NoSuchElementException)
        {
            Console.WriteLine("Element with locator: '" + elementLocator + "' was not found.");
            throw;
        }
    }
//this will not wait for page to load
//both properties need to be true in order for element to be clickable
Assert.True(Driver.FindElement(By elementLocator).Enabled)
Assert.True(Driver.FindElement(By elementLocator).Displayed)

//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementClickable(By elementLocator, int timeout = 10)
    {
        try
        {
            var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
            return wait.Until(ExpectedConditions.ElementToBeClickable(elementLocator));
        }
        catch (NoSuchElementException)
        {
            Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
            throw;
        }
    }
public static void ClickAndWaitForPageToLoad(By elementLocator, int timeout = 10)
    {
        try
        {
            var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
            var element = Driver.FindElement(elementLocator);
            element.Click();
            wait.Until(ExpectedConditions.StalenessOf(element));
        }
        catch (NoSuchElementException)
        {
            Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
            throw;
        }
    }
 类似资料:
  • 我正在使用selenium web驱动程序3.4.0查找网站的响应时间。在较早的版本中,我使用了WebDriver wait=new WebDriverWait(driver,10);Wait.Until(ExpectedConditions.VisibilityOfElementLocated(By.id(“myid”)));查找加载的页面。 但这两行代码不适用于版本3.4.0。有没有其他方法可

  • 我尝试遵循return((JavascriptExecutor)driver.executescript(“return document.readystate”).equals(“complete”); 但它不起作用 基本上,上面的命令不能识别以下操作[testng]1535139249496 addons.productaddons信息发送请求到:https://aus5.mozilla.or

  • 问题内容: 我想抓取无限滚动实现的页面的所有数据。以下python代码有效。 这意味着每次我向下滚动到底部时,我需要等待5秒钟,这通常足以使页面完成加载新生成的内容。但是,这可能不是省时的。该页面可能会在5秒内完成新内容的加载。每次向下滚动时,如何检测页面是否完成了新内容的加载?如果可以检测到此情况,则在知道页面加载完成后,可以再次向下滚动以查看更多内容。这样更省时。 问题答案: 该会通过等待页面

  • 我想刮去一个由无限滚动实现的页面的所有数据。下面的python代码可以工作。 这意味着我每次向下滚动到底部,都需要等待5秒,一般情况下足够页面完成加载新生成的内容。但是,这可能没有时间效率。页面可能在5秒内完成加载新内容。每次向下滚动时,如何检测页面是否加载完新内容?如果我能检测到这一点,我可以再次向下滚动查看更多的内容,一旦我知道页面加载完成。这样时间效率更高。

  • 问题内容: 我想抓取无限滚动实现的页面的所有数据。以下python代码有效。 这意味着每次我向下滚动到底部时,我都需要等待5秒,这通常足以使页面完成加载新生成的内容。但是,这可能不是省时的。该页面可能会在5秒内完成新内容的加载。每次向下滚动时,如何检测页面是否完成了新内容的加载?如果可以检测到此情况,知道页面完成加载后,可以再次向下滚动以查看更多内容。这样更省时。 问题答案: 该会通过等待页面加载

  • 我正在使用Python 2.7与火狐的硒网络驱动程序,我有一个问题,我不能解决或在互联网上找到解决。我的任务是打开大约10k个网页(adsl路由器Web界面 - 通过IP地址)并上传新固件。我写了代码,但为了完成它,我必须学习如何使硒webdriver不要像永远一样等待页面加载,而是等待2分钟(这是新固件上传所需的时间),然后继续下一步。我以为我让它永远等待(等待路由器重新连接 - 速度慢得多,但