Нажатие на ссылку <a href="javascript:;"...> с помощью хроматографа Selenium возвращает ошибку «элемент не виден» в C # - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть сайт со ссылкой внутри div.Проверка HTML-источника с веб-страницы выглядит следующим образом:

<div class="add-to-cart-wrapper">
    <button data-tooltip="Only investments from the selected page will be sold." data-theme="dark" data-placement="top" data-tooltip-trigger="hover" data-id-list="48999040" class="btn btn-default tooltip-item trigger-sell-all">
        Sell All
    </button>
    <a href="javascript:;" data-tooltip="Remove all investments from sale" data-placement="top" data-theme="dark" data-tooltip-trigger="hover" data-currency-iso-code="978" class="trigger-remove-all-sales">
        <i class="fas fa-reply-all fa-flip-vertical"></i>
    </a>
</div>

В браузере это выглядит так:

enter image description here

ЧтоЯ на самом деле пытаюсь архивировать, чтобы нажать на эти две серые стрелки под кнопкой «Продать все».Что соответствует <a href="javascript:;" [...]>

К сожалению, следующий код C # для Selenium (Chromedriver) возвращает, что элемент в настоящее время не виден, хотя я могу нажать на него в браузере вручную:

var link = buttonWrapper.FindElement(By.ClassName("trigger-remove-all-sales"));
link.Click();

Сообщение об ошибке выглядит следующим образом:

OpenQA.Selenium.ElementNotVisibleException: «элемент не виден
(информация о сессии: хром = 68.0.3440.106) (информация Driver: chromedriver = 2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e), платформа = Windows NT 10.0.17134 x86_64) '

какие-либо предложения о том, как действовать?

РЕДАКТИРОВАТЬ: Согласно предложению, я добавил' wait.Until ("элемент x виден ")" согласно приведенному ниже коду.к сожалению, я сталкиваюсь с ошибкой тайм-аута:

new WebDriverWait(browser, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("div.add-to-cart-wrapper a.trigger-remove-all-sales[data-tooltip='Remove all investments from sale']"))).Click();

OpenQA.Selenium.WebDriverTimeoutException: «Превышено время ожидания через 20 секунд»

В соответствии с предложением я попытался найтиЭлемент с .FindElement () Я заметил, что это свойство Displayed=false

enter image description here

Я добавил Thread.Sleep(120000) между ними и посмотрел вверхсвежий код, чтобы увидеть, что изменится.Это код тестирования:

var buttonWrapper = browser.FindElement(By.ClassName("add-to-cart-wrapper"));
var link = buttonWrapper.FindElement(By.ClassName("trigger-remove-all-sales"));
Thread.Sleep(120000);
buttonWrapper = browser.FindElement(By.ClassName("add-to-cart-wrapper"));
link = buttonWrapper.FindElement(By.ClassName("trigger-remove-all-sales"));

Даже после 2-минутного ожидания элемент найден, но все равно отображается как Displayed=false

В консоли разработчика Google Chrome я наблюдалэлемент и обнаружил следующее свойство: enter image description here

Существует прослушиватель событий для a.trigger-remove-all-sales, который может быть использован

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Я сделал очень, очень грязный обходной путь, переместив позицию мыши и выполнив щелчок по позиции, а не по элементу.

Но это решение действительно очень грязное и подвержено ошибкам, когда что-то меняется на сайте. Поэтому я не хочу отмечать это как ответ:

new Actions(browser).MoveToElement(link, 1225, 565).Click().Build().Perform();

чтобы увидеть, где на самом деле находится мышь, вы можете установить маркер паузы / прерывания перед этой строкой, открыть драйвер браузера и вставить следующий код js в консоль разработчика:

// Create mouse following image.
var seleniumFollowerImg = document.createElement("img");

// Set image properties.
seleniumFollowerImg.setAttribute('src', 'data:image/png;base64,'
+ 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAQAAACGG/bgAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA'
+ 'HsYAAB7GAZEt8iwAAAAHdElNRQfgAwgMIwdxU/i7AAABZklEQVQ4y43TsU4UURSH8W+XmYwkS2I0'
+ '9CRKpKGhsvIJjG9giQmliHFZlkUIGnEF7KTiCagpsYHWhoTQaiUUxLixYZb5KAAZZhbunu7O/PKf'
+ 'e+fcA+/pqwb4DuximEqXhT4iI8dMpBWEsWsuGYdpZFttiLSSgTvhZ1W/SvfO1CvYdV1kPghV68a3'
+ '0zzUWZH5pBqEui7dnqlFmLoq0gxC1XfGZdoLal2kea8ahLoqKXNAJQBT2yJzwUTVt0bS6ANqy1ga'
+ 'VCEq/oVTtjji4hQVhhnlYBH4WIJV9vlkXLm+10R8oJb79Jl1j9UdazJRGpkrmNkSF9SOz2T71s7M'
+ 'SIfD2lmmfjGSRz3hK8l4w1P+bah/HJLN0sys2JSMZQB+jKo6KSc8vLlLn5ikzF4268Wg2+pPOWW6'
+ 'ONcpr3PrXy9VfS473M/D7H+TLmrqsXtOGctvxvMv2oVNP+Av0uHbzbxyJaywyUjx8TlnPY2YxqkD'
+ 'dAAAAABJRU5ErkJggg==');
seleniumFollowerImg.setAttribute('id', 'selenium_mouse_follower');
seleniumFollowerImg.setAttribute('style', 'position: absolute; z-index: 99999999999; 
pointer-events: none;');

// Add mouse follower to the web page.
document.body.appendChild(seleniumFollowerImg);

// Track mouse movements and re-position the mouse follower.
$(document).mousemove(function(e) {
$("#selenium_mouse_follower").css({ left: e.pageX, top: e.pageY });
});

после кода перемещения мыши вы можете установить другую точку останова, чтобы посмотреть, куда мышь фактически переместилась в браузере.

Подсказка: удалите .Click(), чтобы случайно не щелкнуть ссылку. Сценарий отслеживания мыши необходимо перезагружать при каждом обновлении страницы, поэтому, когда вы нажимаете на ссылку, вы больше не можете отслеживать свою мышь. также скрипт работает только в том случае, если он инициализирован ДО движения мыши.

0 голосов
/ 20 ноября 2018

Решением, которое я использовал, было использование scriptexecutor для нажатия на работающий элемент:

var button = browser.FindElement(By.ClassName("add-to-cart-wrapper"));
((IJavaScriptExecutor)browser).ExecuteScript("arguments[0].click();", button);
0 голосов
/ 12 сентября 2018

Вам нужно подождать, пока элемент не будет виден, это код Java, вы также можете использовать любой локатор, будь то XPath или идентификатор или имя класса

WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement elem = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("")));
elem.click();

или вы также можете использовать метод elementToBeClickable ()

WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement elem = wait.until(ExpectedConditions.elementToBeClickable(By.id("")));
elem.click();

Конвертируйте этот код в диез C, так как я не очень хорошо его знаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...