我正在尝试自动化一个场景,我将登录 gmail 网站(我的帐户)并单击特定电子邮件(我们自己的网站)以确认电子邮件已发送,但我的问题是 gmail 有时需要超过 5 分钟才能加载完成,因此元素没有加载,当我尝试通过 CSS 单击时,我的测试用例失败了。Gmail加载图标在3-5分钟后停止。
驱动程序初始化代码:
ChromeOptions options = new ChromeOptions();
options.AddArgument("-incognito");
options.AddArgument("--disable-extensions");
DesiredCapabilities capabilites = DesiredCapabilities.Chrome();
capabilites.SetCapability(ChromeOptions.Capability, options);
driver = new ChromeDriver();
driver.Manage().Window.Maximize();
添加强制等待:
System.Threading.Thread.Sleep(30000);
testingdriver.Navigate().GoToUrl(gmail);
System.Threading.Thread.Sleep(30000);
testingdriver.Navigate().GoToUrl(gmail);
System.Threading.Thread.Sleep(30000);
然后点击元素:
IWebElement firstEmailOpening = testingdriver.FindElement(By.CssSelector("tr.zA:nth-child(1)"));
firstEmailOpening.Click();
这个线程睡眠是噩梦,我强烈建议您不要使用网络驱动程序登录gmail的这种方法。相反,您可以使用一些库来访问您的Gmail帐户,有关详细信息,请参阅此处。
使用 Implicit wait
喜欢 -
driver.Navigate().GoToUrl(gmail);
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(60));
建议不要使用 Thread.Sleep(30000);
在这种情况下,假设您提到等待 30 秒,但您的元素在 2 秒内可见。它将额外等待 28 秒。它会使您的脚本变慢。
如果您遇到相同的问题,请使用ExplicitWait
new WebDriverWait(driver, TimeSpan.FromSeconds(45)).Until(ExpectedConditions.ElementExists(By.CssSelector("tr.zA:nth-child(1)")));
driver.FindElement(By.CssSelector("tr.zA:nth-child(1)")).Click();