Элемент не может быть расположен в (x, y): как исправить список WebElements, по которым нужно щелкнуть один за другим - PullRequest
1 голос
/ 06 мая 2019

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

Веб-сайт, который мне нужно почистить, - TripAdvisor.it.

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

Я постоянно получаю сообщение об ошибке "Неизвестная ошибка: элемент не активен в точке (x, y); ..."

Я подумал, что это может быть проблема неполной загрузки javascriptна странице tripadvisor, поэтому я рассмотрел здесь различные возможности стека и попытался добавить явное ожидание, но оно не работает.Другие вещи, которые я пробовал:

  1. Thread.sleep (1000);Я знаю, что это не очень хорошая практика, особенно в цикле, я просто хотел заставить программу ждать, но она не сработала.Я фактически использовал до 3000 миллисекунд.
  2. метод, который проверяет, полностью ли загружена js на веб-странице (я адаптировал некоторый код, который я нашел здесь, в stackExchange, так как я не очень хорошо разбираюсь в javascript).Это дало ошибку TimeOut, я не совсем уверен, что это значит.
  3. с использованием ExpectedCondition .visibilityOf(WebElement elem); вместо .elementToBeClickable(WebElement elem);, так как я понял, что метод .getNumberOfElementsFound(driver, locator) фактически находит все 30 элементов настр.Я все еще получаю ту же ошибку «Элемент не может быть расположен в (x, y) ...»

Вот код, который выдает исключение:

...
    By locator = By.xpath("//a[contains(@class, 'attractions-attraction-overview-main-TopPOIs__name')]");

    int numberOfElementsFound = getNumberOfElementsFound(driver, locator);

    for (int pos = 0; pos < numberOfElementsFound; pos++) {

        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(getElementWithIndex(driver, locator, pos))).click();
        ...
    }

И вот полное сообщение об ошибке:

org.openqa.selenium.WebDriverException: неизвестная ошибка: Элемент ... не активируется в точке (360, 14).Другой элемент получит щелчок: ...

Здесь - это ссылка на фактическую веб-страницу, над которой я работаю, если это поможет.

Правильно ли я оценил, что виновником здесь является javascript?Я пришел к выводу, что это может быть связано с тем, что, когда я ищу этот тег «ui_column wrap_column responseive_inline_hidden label_column» на текущей странице, я не могу его найти.

Что мне следует сделать, чтобы исправить эту ошибку?

1 Ответ

1 голос
/ 06 мая 2019

Есть несколько причин, по которым Другой элемент получит ошибку click ;но обычно это происходит из-за того, что что-то было добавлено на экран.

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

Я заметил, что при наведении указателя мыши на «Firenze» в верхней части окна выпадающий список охватывает часть изображения «Gite di un giorno».Поэтому, если автоматизация считает, что курсор находится над «Firenze» при загрузке страницы, появится раскрывающийся список, и автоматика щелкнет раскрывающийся список вместо изображения, вызывающего сообщение об ошибке.

В этом случаеВы должны сделать то, что я называю методом "clickOut", прежде чем нажимать на любую из ссылок.«ClickOut» - это одноразовый метод, который просто нажимает на тег <body>.Они полезны, когда на экране появляются всплывающие окна, которые исчезают, если вы щелкаете за пределами всплывающего окна.Но в этом случае он фактически переместит курсор и приведет к исчезновению любого из раскрывающихся списков.

Это длинный выстрел, но я видел его несколько раз в тестах сборки.

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