[英]Explicit waits in Selenium C# doesn't work . What is wrong?
所以我有明確的等待這個問題。 我不想使用Thread.Sleep()。 這是一個簡單的測試,它打開一個頁面然后前后移動。 加載此頁面大約需要2-3秒,我想以動態方式(測試)執行此操作。 希望我不是太混亂。 我做了很多研究,但沒有任何作用,也許我做錯了什么。 (我正在使用Resharper進行單元測試)
在這里我也有解決方案:
https://www.dropbox.com/s/1k5vjc5czvmdd3u/ConsoleApplication2.rar?dl=0
我正在使用FindElement方法的擴展,所以我相信只需調用此方法並自行等待即可。 我在解決方案中有一些解釋。 如果有人給我一些幫助,我將不勝感激。 (抱歉沒有那么完美的英語)。
using System;
using System.Threading;
using ConsoleApplication2.Extensions;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
namespace ConsoleApplication2
{
class UnitTest1
{
private IWebDriver driver = new ChromeDriver();
[SetUp]
public void Initialize()
{
driver.Url = "some url";
Thread.Sleep(3500);
// driver.Manage().Timeouts().ImplicitlyWait(TimeSpan(20));
}
[Test]
public void CheckBackForward()
{
//Go to first page in Online Help
driver.FindElement(By.XPath("//span/ul/li/span/a")).Click();
// So if I am commenting this Thread.Sleep
// it will throw an exception at the extension method at line 13 at "@by"
// I've also checked this without extension method but still the same problem. It doesn'w wait at all, it will throw this
// exception as soon as FindElement method is called.
// I know that I shouldn't mix explicit waits with implicit ones.
//Thread.Sleep(1500);
//Store title
var title_text = driver.FindElement(By.XPath("//div[@id='shellAreaContent']/div/div[2]/ol/li[3]/span"),60).Text;
//Check if Back is enabled
Assert.IsTrue(driver.FindElement(By.XPath("//div[3]/a/span")).Enabled);
//Go back
driver.FindElement(By.XPath("//div[3]/a/span")).Click();
//Check if Forward is enabled
Assert.IsTrue(driver.FindElement(By.XPath("//div[4]/a/span")).Enabled);
//Go forward
driver.FindElement(By.XPath("//div[4]/a/span")).Click();
//Store title
var title_text2 = driver.FindElement(By.XPath("//div[@id='shellAreaContent']/div/div[2]/ol/li[3]/span")).Text;
//Check if you are on the same page
Assert.AreEqual(title_text2,title_text);
}
[TearDown]
public void EndTest()
{
driver.Quit();
}
}
}
這是擴展:
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
namespace ConsoleApplication2.Extensions
{
public static class Extension
{
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
if (timeoutInSeconds <= 0) return driver.FindElement(@by);
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(@by));
}
}
}
我用Selenium編寫了6個多月的代碼,我和你的問題一樣。 我創建了這個擴展方法,它每次都適合我。
代碼的作用是:在20秒內,它會檢查每個500毫秒,無論該元素是否存在於頁面上。 如果在20秒之后,它沒有找到,它將拋出異常。 這將有助於您進行動態等待。
public static class SeleniumExtensionMethods {
public static WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
public static void SafeClick(this IWebElement webElement) {
try {
wait.Until(ExpectedConditions.ElementToBeClickable(webElement)).Click();
} catch (TargetInvocationException ex) {
Console.WriteLine(ex.InnerException);
}
}
然后替換你的代碼:
driver.FindElement(By.XPath("//span/ul/li/span/a")).Click();
有:
IWebElement x = driver.FindElement(By.XPath("//span/ul/li/span/a"));
x.SafeClick();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.