Элементы Selenium Hover с IE
У меня есть HTML div
тег и внутри div есть элемент, который появляется, когда мышь входит в его границы. Теперь я хочу нажать на элемент, который становится видимым при вводе или зависании мыши.
Проблема: элемент начинает мигать. Браузер: IE8
Я использую код ниже
IWebElement we = addToBasket.FindElement(By.Id("MyBox"));
action.MoveToElement(we).MoveToElement(driver.FindElement(By.Id("plus-icon"))).Click().Build().Perform();
Любое предложение, почему он мигает?
2 ответа
Элемент мигает из-за функции драйвера IE, называемой "постоянные зависания". Эта особенность имеет сомнительную ценность, но необходима из-за того, что IE (браузер, а не драйвер) реагирует на тупик WM_MOUSEMOVE
сообщения при использовании SendMessage
API.
У вас есть несколько вариантов. Вы можете отключить постоянные зависания, используя код, подобный следующему:
InternetExplorerOptions options = new InternetExplorerOptions();
options.EnablePersistentHover = false;
IWebDriver driver = new InternetExplorerDriver(options);
Имейте в виду, однако, что это приведет к тому, что при попытке наведения курсора курсор мыши находится на экране. Если это неприемлемо, у вас есть пара других подходов, которые вы можете использовать. Во-первых, вы можете отключить так называемые "собственные события", которые заставят драйвер полагаться исключительно на синтезированные события JavaScript. Этот подход имеет свои подводные камни, поскольку для синтеза событий мыши полагается только на JavaScript.
InternetExplorerOptions options = new InternetExplorerOptions();
options.EnableNativeEvents = false;
IWebDriver driver = new InternetExplorerDriver(options);
Наконец, вы можете перейти от использования по умолчанию SendMessage
Windows API для кода, который использует более правильный SendInput
API. Это сделано с RequireWindowFocus
имущество. Его недостатком является то, что ввод мыши вводится на очень низком уровне в системе, что требует, чтобы окно IE было окном переднего плана в системе.
InternetExplorerOptions options = new InternetExplorerOptions();
options.RequireWindowFocus = true;
IWebDriver driver = new InternetExplorerDriver(options);
В заключение, не пытайтесь установить все эти свойства одновременно; выбрать подход и придерживаться его. Некоторые из них являются взаимоисключающими, и взаимодействие между ними не определено.
Это сработало для меня.
WebElement element = driver.findElement(By.xpath("element xpath"));
Locatable hoverItem = (Locatable) element;
Mouse mouse = ((HasInputDevice) driver).getMouse();
mouse.mouseMove(hoverItem.getCoordinates());