Dies kann passieren, wenn das Element seine Position ändert, während der Treiber versucht, darauf zu klicken (ich habe dies auch beim IE beobachtet). Der Treiber behält die ursprüngliche Position bei, aber wenn er tatsächlich auf das Element klickt, zeigt diese Position nicht mehr auf das Element. Der FireFox-Treiber hat dieses Problem übrigens nicht, offenbar "klickt" er Elemente programmatisch an.
Jedenfalls kann dies passieren, wenn Sie Animationen verwenden oder einfach die Höhe von Elementen dynamisch ändern (z. B. $("#foo").height(500)
). Sie müssen sicherstellen, dass Sie nur Elemente klicken, nachdem sich ihre Höhe "eingependelt" hat. Ich endete mit Code, der wie folgt aussieht (C# Bindungen):
if (!(driver is FirefoxDriver))
{
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}
Im Falle einer Animation oder eines anderen Faktors, den Sie nicht einfach abfragen können, können Sie eine "generische" Methode verwenden, die darauf wartet, dass das Element stationär ist:
var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d =>
{
var e = driver.FindElement(By.Id(someId));
if (e.Location == prevLocation)
{
stationaryCount++;
return stationaryCount == desiredStationarySamples;
}
prevLocation = e.Location;
stationaryCount = 0;
return false;
});