C# 相当于 Java 等待
C# equivalent of Java awaitility
我想将 Java 中的内容复制到 C#。
我不是在寻找,或任何会涉及 driver:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
我正在使用 http://www.awaitility.org/。
代码如下:
public static void waitForElement(WebElement element) {
with()
.pollDelay(100, TimeUnit.MICROSECONDS)
.and()
.pollInterval(200, TimeUnit.MICROSECONDS)
.await()
.ignoreExceptions()
.until(() -> element.isDisplayed());
}
谢谢
我会做类似的事情
public static async Task WaitForElementAsync(WebElement element)
{
await With(100, 200, true, () => element.isDisplayed());
}
private static async Task With(
int pollDeley,
int pollIntervall,
bool ignoreException,
Func<bool> until)
{
await Task.Delay(pollDeley);
var loop = true;
while (loop)
{
try
{
loop = !until();
if (!loop) break;
await Task.Delay(pollIntervall);
}
catch (Exception ex)
{
if (!ignoreException) throw;
}
}
}
但如果 WebElement
有像 IsDisplayedChanged
这样的事件,可能会有更好的解决方案。
此外,通过此解决方案,您还可以在项目中引入异步调用行(这在 Web 上下文中可能是有益的),为避免这种情况,您可以将 await Task.Delay(...)
替换为 Thread.Sleep(...)
。
另一种解决方案是使用计时器进行轮询
private static async Task With(
int pollDeley,
int pollIntervall,
bool ignoreException,
Func<bool> until)
{
await Task.Delay(pollDeley);
var tcs = new TaskCompletionSource<bool>();
using (var timer = new Timer(pollIntervall))
{
void Poll(object sender, ElapsedEventArgs e)
{
try
{
if (until())
{
if (tcs.TrySetResult(true))
{
timer.Stop();
}
}
}
catch (Exception ex)
{
if (!ignoreException)
{
if (tcs.TrySetException(ex))
{
timer.Stop();
}
}
}
}
timer.Elapsed += Poll;
timer.Start();
await tcs.Task;
timer.Elapsed -= Poll;
}
}
我想将 Java 中的内容复制到 C#。
我不是在寻找,或任何会涉及 driver:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
我正在使用 http://www.awaitility.org/。
代码如下:
public static void waitForElement(WebElement element) {
with()
.pollDelay(100, TimeUnit.MICROSECONDS)
.and()
.pollInterval(200, TimeUnit.MICROSECONDS)
.await()
.ignoreExceptions()
.until(() -> element.isDisplayed());
}
谢谢
我会做类似的事情
public static async Task WaitForElementAsync(WebElement element)
{
await With(100, 200, true, () => element.isDisplayed());
}
private static async Task With(
int pollDeley,
int pollIntervall,
bool ignoreException,
Func<bool> until)
{
await Task.Delay(pollDeley);
var loop = true;
while (loop)
{
try
{
loop = !until();
if (!loop) break;
await Task.Delay(pollIntervall);
}
catch (Exception ex)
{
if (!ignoreException) throw;
}
}
}
但如果 WebElement
有像 IsDisplayedChanged
这样的事件,可能会有更好的解决方案。
此外,通过此解决方案,您还可以在项目中引入异步调用行(这在 Web 上下文中可能是有益的),为避免这种情况,您可以将 await Task.Delay(...)
替换为 Thread.Sleep(...)
。
另一种解决方案是使用计时器进行轮询
private static async Task With(
int pollDeley,
int pollIntervall,
bool ignoreException,
Func<bool> until)
{
await Task.Delay(pollDeley);
var tcs = new TaskCompletionSource<bool>();
using (var timer = new Timer(pollIntervall))
{
void Poll(object sender, ElapsedEventArgs e)
{
try
{
if (until())
{
if (tcs.TrySetResult(true))
{
timer.Stop();
}
}
}
catch (Exception ex)
{
if (!ignoreException)
{
if (tcs.TrySetException(ex))
{
timer.Stop();
}
}
}
}
timer.Elapsed += Poll;
timer.Start();
await tcs.Task;
timer.Elapsed -= Poll;
}
}