通过添加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;
});
}
我只是不知道在代码的什么地方等待。
就个人而言,我的Selenium代码充满了“测试失败报告”测试和尝试捕获块,这些测试块报告了故障发生的位置。如果以这种方式对代码进行建模,它应该会缩小问题的范围,并提示您需要等待的位置。
您可以等待某个条件得到满足:
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上不呈现任何内容,因此我不能使用显式等待。此外,隐式只适用于语句,同样没有用处。 我成功地使用了,但我希望有更好的方法来延迟执行。