Нажмите на псевдоэлемент, используя 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.

Надеюсь, что это поможет.