Нажмите на псевдоэлемент, используя Selenium
4 Jand [2017-08-01 03:33:00]
Я пытаюсь использовать Selenium, чтобы щелкнуть элемент:: после псевдоэлемента. Я понимаю, что это невозможно сделать через WebDriver напрямую, но, похоже, не может найти способ сделать это с помощью Javascript.
Вот что выглядит DOM:
<em class="x-btn-split" unselectable="on" id="ext-gen161">
<button type="button" id="ext-gen33" class=" x-btn-text">
<div class="mruIcon"></div>
<span>Accounts</span>
</button>
::after
</em>
Вот как выглядит элемент выше. Левая сторона объекта - это элемент 'button', а элемент: after - это правая сторона со стрелкой, которая при нажатии выпадала при выпадающем меню. Поскольку вы можете видеть, что правая сторона не имеет идентификаторов вообще, и это частично то, что делает это трудным занятием.
Я видел эти две ссылки в stackoverflow и пытался объединить ответы для формирования моего решения, но безрезультатно.
Щелчок по элементу в Selenium WebDriver с использованием JavaScript
Поиск псевдоэлемента в Selenium WebDriver с использованием JavaScript
Вот одна из моих попыток:
string script = "return window.getComputedStyle(document.querySelector('#ext-gen33'),':before')";
IJavaScriptExecutor js = (IJavaScriptExecutor) Session.Driver;
js.ExecuteScript("arguments[0].click(); ", script);
В котором я получаю эту ошибку:
System.InvalidOperationException: 'unknown error: arguments[0].click is not a function
(Session info: chrome=59.0.3071.115)
(Driver info: chromedriver=2.30.477700 (0057494ad8732195794a7b32078424f92a5fce41),platform=Windows NT 6.1.7601 SP1 x86_64)'
Я также попытался использовать класс Actions в Selenium, чтобы переместить мышь в ссылку на левую сторону, аналогичную этому ответу. Я думаю, это может быть из-за того, что я не знаю, что измеряется смещение, и документация, похоже, не дает никаких указаний. Я думаю, что это в пикселях?
Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).MoveByOffset(235, 15).Click().Build().Perform();
Кажется, что эта попытка щелкнет где-то, поскольку она не дает никаких ошибок, но я не совсем уверен, где.
Я пытаюсь автоматизировать Salesforce (облако обслуживания) в С#, если это помогает.
Может кто-то может предложить решение?
javascript c# pseudo-element selenium
2 ответа
3 Решение Maciej Podstawka [2017-09-12 16:44:00]
Я столкнулся с одной и той же проблемой при написании тестов Selenium для Salesforce и смог решить ее путем прямого управления мышью с помощью Actions.
Таблица Wrapper для этой кнопки имеет жестко заданную ширину 250 пикселей, и вы заметили это. Чтобы найти, где находится мышь, вы можете использовать метод contextClick()
вместо Click().
. Он имитирует правую кнопку мыши, чтобы он всегда открывал меню браузера.
Если вы выполните:
Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).ContextClick().Build().Perform();
вы заметите, что мышь перемещается в середину WebElement, а не в верхний левый угол (я думал, что он тоже). Поскольку эта ширина элемента постоянна, мы можем перемещать мышь только на 250 / 2 - 1
вправо, и она будет работать:)
код:
Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).MoveByOffset(124, 0).Click().Build().Perform();
1 AmrithS [2017-10-04 08:05:00]
Для тех, кто пытается это сделать в Python, решение находится ниже:
elem= driver.<INSERT THE PATH TO ELEMENT HERE>
ActionChains(driver).move_to_element_with_offset(elem,249,1).click().perform()
В основном здесь я нахожу свой элемент в DOM и присваиваю WebElement. Затем WebElement передается методом move_to_element_with_offset как параметр.
Я получил значения px для элемента из инструментов разработчика.
PS: используйте этот импорт из selenium.webdriver.common.action_chains import ActionChains
Подробнее о классе цепочки действий и его методе move_to_element_with_offset можно узнать здесь: http://selenium-python.readthedocs.io/api.html.
Надеюсь, что это поможет.