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

硒C#代码工作,但需要等待或延迟

谷梁承宣
2023-03-14

通过添加while(ele==null)循环,我让代码大部分时间都在调试器之外运行和工作。非常难看。这让我认为我需要使用包装器覆盖FindElements()函数,但不知道如何这样做来增加一些延迟。Selenium Webdrive中的显式等待findElements有一个示例,但它是用JavaScript编写的。我把这个示例放在下面的代码中。有人能指导我吗?

        public void WriteAPost()
        {
           ele = driver.FindElements(By.CssSelector(".a8c37x1j.ni8dbmo4.stjgntxs.l9j0dhe7.ltmttdrg.g0qnabr5.ojkyduve")).FirstOrDefault(x => x.Text == "Create Post");

            while(ele == null)
            {
                ele = driver.FindElements(By.CssSelector(".a8c37x1j.ni8dbmo4.stjgntxs.l9j0dhe7.ltmttdrg.g0qnabr5.ojkyduve")).FirstOrDefault(x => x.Text == "Create Post");
            }

            ele.Click();
            Thread.Sleep(3000);

            ele = driver.SwitchTo().ActiveElement();

            PClipboard.SetText("Post text to use for Text Area");
            ele.SendKeys(OpenQA.Selenium.Keys.Control + 'v');

            Thread.Sleep(3000);

            ele = driver.FindElements(By.XPath("//div[@role = 'button']")).FirstOrDefault(x => x.Text == "Post");

            while (ele == null)
            {
                ele = driver.FindElements(By.XPath("//div[@role = 'button']")).FirstOrDefault(x => x.Text == "Post");
            }

            ele.Click();
            Thread.Sleep(3000);

            driver.Quit();
     }

    static class PClipboard
    {
        public static void SetText(string p_Text)
        {
            Thread STAThread = new Thread(
                delegate ()
                {
                    // Use a fully qualified name for Clipboard otherwise it
                    // will end up calling itself.
                    System.Windows.Forms.Clipboard.SetText(p_Text);
                });
            STAThread.SetApartmentState(ApartmentState.STA);
            STAThread.Start();
            STAThread.Join();
        }
    }
}

// Javascript FindElements() wrapper

    /// <summary>
    /// Allows you to execute the FindElements call but specify your own timeout explicitly for this single lookup
    /// </summary>
    /// <remarks>
    /// If you want no timeout, you can pass in TimeSpan.FromSeconds(0) to return an empty list if no elements match immediately. But then you may as well use the original method
    /// </remarks>
    /// <param name="driver">The IWebDriver instance to do the lookup with</param>
    /// <param name="findBy">The By expression to use to find matching elements</param>
    /// <param name="timeout">A timespan specifying how long to wait for the element to be available</param>
    public static ReadOnlyCollection<IWebElement> FindElements(this IWebDriver driver, By findBy, TimeSpan timeout)
    {
        var wait = new WebDriverWait(driver, timeout);
        return wait.Until((d) =>
        {
            var elements = d.FindElements(findBy);
            return (elements.Count > 0)
                ? elements
                : null;
        });
    }

共有2个答案

黄隐水
2023-03-14

我只是不知道在代码的什么地方等待。

就个人而言,我的Selenium代码充满了“测试失败报告”测试和尝试捕获块,这些测试块报告了故障发生的位置。如果以这种方式对代码进行建模,它应该会缩小问题的范围,并提示您需要等待的位置。

华景明
2023-03-14

您可以等待某个条件得到满足:

new WebDriverWait(driver, timeout).Until(ExpectedConditions.ElementExists((By.Id(id))));

或者您可以隐式等待:

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(timeInSeconds);
 类似资料:
  • 我试图使用SeleniumWebDriverWait类型,在检查元素是否存在之前,等待页面完全加载。我尝试了两种不同的方法。 第一个方法使用IgnoreExceptionTypes,然后在Until方法内调用FindElement。这会立即抛出NoTouchElementException,而无需等待。我希望这会继续尝试查找元素,直到超时,同时忽略NosTouchElementException。

  • 在C#中,我有以下两个简单的例子: 第一个示例创建一个打印“开始”的任务,等待5秒钟打印“完成”,然后结束任务。我等待任务完成,然后打印“全部完成”。当我运行测试时,它会按预期运行。 第二个测试应该具有相同的行为,只是由于使用了async和Wait,任务内部的等待应该是非阻塞的。但是这个测试只打印“开始”,然后立即打印“全部完成”和“完成”,永远不会打印。 我不知道我为什么会有这样的行为:S非常感

  • 问题内容: 我如何将while循环延迟到1秒的间隔,而又不将正在运行的整个代码/计算机的速度减慢到1秒钟的延迟(只是一个小循环)。 问题答案:

  • 我第一次做硒测试。在主页上,我调用了一些AJAX,我希望Selenium等待元素加载完成。我不确定它是否有效,但我只是键入selenium,waitForCondition可以选择。 无论我选择什么,它总是返回“false”。我现在连等待条件都不工作吗? 我如何测试它是否有效?在这些代码中我做错了什么? 如果由自己的类实现,则返回“true” isElementPresent(By.xpath(“

  • 问题内容: 我正在学习Java Maven Selenium。我希望在Selenium中使用。 打开网站(例如https://www.facebook.com) 单击登录的电子邮件字段 等待20秒 输入我的电子邮件 这是我的简单代码: 该代码不起作用。它只会打开Facebook,单击电子邮件字段并输入我的电子邮件ID,而不是等待10秒钟才输入我的电子邮件。 问题答案: 并且无法正常工作,他们将在指

  • 我试图对其运行黑盒测试的web应用程序可以使用ajax调用,但这些ajax调用在DOM上不呈现任何内容,因此我不能使用显式等待。此外,隐式只适用于语句,同样没有用处。 我成功地使用了,但我希望有更好的方法来延迟执行。