Waiting until the page loads
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
Selecting a sibling using xPath
// Just in one sentence: var sibling = driver.FindElement(By.XPath("//input[@id='myId']/following-sibling::span[@class='someClass']")); // Or if you already had the first one: var someElement = driver.FindElement(By.Id("myIdentifier")); var icon = someElement.FindElement(By.XPath("//following-sibling::span[@class='someClass']"));
Hovering over an element
I found myself in trouble when trying to test a feature that required hovering the mouse over an element. It seems there is an easy way of doing it using Selenium with an action and:
var icon = driver.FindElement(By.Id("myIcon")); var action = new Actions(driver); action.MoveToElement(icon); //I think in theory this is how it should be done action.MoveToElement(icon).Click().Build().Perform(); // Though many people around stackoverflow suggested to use this other one. action.MoveByOffset(icon.Location.X, icon.Location.Y); //And I even tried this one.
Unfortunately none of them work due to me using jQuery to trigger the event with a .hover() and jQuery using different events to trigger this, those are ‘mouseenter’ and ‘mouseleave’, but not ‘mouseover’, as Kevin explains here. Thanks Kevin.
So the solution I implemented was to activate the event using the same jQuery:
var js = "$('#myIcon').trigger('mouseenter')"; ((IJavaScriptExecutor)driver).ExecuteScript(js);
And that worked perfectly.