Once you have your logging sorted out, the next thing you need to be concerned with is synchronization. In Selenium 1, this was accomplished with the dozen or so wait_for variants. In Selenium 2, they are gone and replaced with some new synchronization methods.
I’m sure there is an official way of doing synchronization in Selenium 2, but I have yet to figure it out. Needing something now though, here is a class that you can use to start getting synchronization in your C# scripts. A big thanks to David Burns for the original direction on the WaitForElement one.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.IE; using OpenQA.Selenium.Internal; namespace Element34 { static class Waits { public static IWebElement WaitForElement(IWebDriver driver, By by) { IWebElement element; for (int second = 0; ; second++) { if (second >= 60) Assert.Fail("timeout"); try { element = driver.FindElement(by); if (element != null) break; } catch (Exception) { } Thread.Sleep(1000); } return element; } public static IWebElement WaitForElementVisible(IWebDriver driver, By by) { IWebElement element; for (int second = 0; ; second++) { if (second >= 60) Assert.Fail("timeout"); try { element = driver.FindElement(by); if (element != null) { IRenderedWebElement tmpElement = (IRenderedWebElement)driver.FindElement(by); if (tmpElement.Displayed) { break; } } } catch (Exception) { } Thread.Sleep(1000); } return element; } public static void WaitForFrame(IWebDriver driver, String frame) { for (int second = 0; ; second++) { if (second >= 60) Assert.Fail("timeout"); try { driver.SwitchTo().Frame(frame); break; } catch (Exception) { } Thread.Sleep(1000); } } } } |
Comments 1
In Selenium 2, U can do like this:
using OpenQA.Selenium.Support.UI;
WebDriverWait wait = new WebDriverWait(ff, TimeSpan.FromSeconds(10));
Posted 14 Sep 2012 at 4:50 am ¶wait.Until((d) => { return d.Title.StartsWith(“page title”); });
Post a Comment