Не удается щелкнуть правой кнопкой мыши, Java Selenium WebDriver java.lang.UnsupportedOperationException: contextMenu

Это сводит меня с ума, мне просто нужно, чтобы WebDriver щелкнул правой кнопкой мыши по элементу, и остальная часть моего селена будет работать.

Я использую Eclipse, все мои импорты и библиотеки .jar настроены правильно.

WebDriver driver = new FirefoxDriver();
String baseUrl = "http://............/";
selenium = new WebDriverBackedSelenium(driver, baseUrl);

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

selenium.click("//tr[@id[contains(.,'Equipment')]]");

Это работает просто отлично, строка, по которой щелкнули, выделяется, как и должно быть.

Теперь мне просто нужно щелкнуть по нему правой кнопкой мыши, но я не могу! Пытающийся:

selenium.contextMenu("//tr[@id[contains(.,'Equipment')]]");

не удается щелкнуть правой кнопкой мыши и возвращает ошибку: java.lang.UnsupportedOperationException: contextMenu.

Существует элемент, который не считается «видимым», пока эта строка не будет нажата правой кнопкой мыши. Он определяется как существующий, но селен не запустит его, если я не щелкну его правой кнопкой мыши в середине запуска в WebDriver, чтобы сделать его видимым. В противном случае это просто дает мне это:

com.thoughtworks.selenium.SeleniumException: элемент в настоящее время не отображается, поэтому с ним нельзя взаимодействовать.

Щелчок правой кнопкой мыши по этой строке делает элемент «видимым», поэтому мне нужно так сильно щелкнуть правой кнопкой мыши по селену. Я проверил, чтобы убедиться, что невидимый элемент определяется как существующий.

boolean exists = selenium.isElementPresent("//a[@id[contains(.,'faction')]]");
boolean visible = selenium.isVisible("//a[@id[contains(.,'faction')]]");
System.out.println("Exists: " + exists);
System.out.print("Visible: " + visible);

Дает мне

Exists: true
Visible: false

Другими словами, это не проблема с моим xpath. Это здесь. Это просто не "видно". Я также пытался отправить Shift + F10 вместо щелчка правой кнопкой мыши, но это не помогло.

Все это отлично работает в Selenium IDE, но мне нужно, чтобы он работал с WebDriver, чтобы я мог возиться с ним в Java. Пожалуйста, помогите мне.

РЕДАКТИРОВАТЬ: Благодаря совету Сланека и большему количеству возни с конструктором действий я обнаружил, что проблема заключается в том, что мой веб-драйвер selenium не обновлен для Firefox 14. Это странно, учитывая, что я думал, что загрузил самый последний только в прошлый четверг. . В любом случае, по-видимому, встроенная поддержка событий для Firefox 14 не была добавлена ​​​​до веб-драйвера 2.25.0, а я использую 2.24.1.


person Mike    schedule 20.07.2012    source источник
comment
Посмотрите, поможет ли этот пост stackoverflow. ком/вопросы/7647154/   -  person anazimok    schedule 21.07.2012
comment
увы, это я уже пробовал. Я получаю: Исключение в потоке main org.openqa.selenium.InvalidElementStateException: невозможно выполнить собственное взаимодействие: не удалось загрузить собственный компонент событий. Несмотря на то, что у меня есть profile.setEnableNativeEvents(true);, он все равно выдает мне эту ошибку, когда я пытаюсь сделать это с помощью действий. Возможно, есть способ заставить Firefox перестать заботиться о том, скрыт ли элемент или нет?   -  person Mike    schedule 21.07.2012
comment
Есть ли какая-то особая причина, по которой вы используете новый WebDriver через старый интерфейс Selenium? Вы унаследовали набор тестов до того, как вам пришлось его поддерживать, или вам просто нравится старый формат?   -  person Petr Janeček    schedule 21.07.2012


Ответы (2)


К сожалению, при просмотре в исходном коде метод contaxtMenu() не добавлен в эмуляцию WebDriver. Его даже нет в пакете org.openqa.selenium.internal.seleniumemulation, где сидят все остальные методы (замаскированные классы через шаблон Command). Скорее всего, он не был перенесен в WebDriverBackedSelenium, когда он был представлен (помните, Selenium RC устарел и не находится в активной разработке?).

Что вы можете попробовать:

  1. Избавьтесь от Selenium RC, если еще можете. WebDriver API намного чище, мощнее и активно развивается :). Чтобы сделать это с помощью WebDriver, вы должны сделать

    WebElement elem = driver.findElement(By.xpath("//tr[@id[contains(.,'Equipment')]]"));
    new Actions(driver).contextClick(elem).perform();
    
  2. Попробуйте выполнить именно эту задачу с созданным вами объектом WebDriver, а затем снова вернуться к использованию Selenium. Две приведенные выше строки кода, возможно, должны работать, если их просто вставить между кодом Selenium.

  3. Реализуйте его самостоятельно. Это не так сложно. Просто посмотрите на пакет org.openqa.selenium.internal.seleniumemulation и класс WebDriverCommandProcessor, добавьте метод contextMenu(), как описано выше. Это будет означать создание собственных сборок Selenium из отредактированного исходного кода, но почему бы и нет.

  4. В крайнем случае — выясните, какого именно действия ожидает скрытый элемент, и смоделируйте событие с помощью fireEvent(). Выполнение следующего должно помочь (если нет, это просто ожидание другого события):

    fireEvent("//tr[@id[contains(.,'Equipment')]]", "contextmenu")
    

В качестве примечания, вместо длинного

"//tr[@id[contains(.,'Equipment')]]"

или немного лучше

"//tr[contains(@id,'Equipment')]"

вы могли бы просто написать это:

"css=tr[id*='Equipment']"

Разве это не немного лучше и читабельнее? Мне очень удобно работать с XPath, но изучение некоторых базовых селекторов CSS (которые могут делать большинство, но определенно не все XPath) не так уж и страшно...

person Petr Janeček    schedule 21.07.2012
comment
Здравствуйте, спасибо за подсказку по выбору css. Я новичок в селене и только начал с него пару дней назад, я обязательно буду его использовать. Код небольшой, и использование WebDriver API не проблема, на самом деле я пробовал оба. Когда я пытался создать действие и заставить его выполнять контекстный щелчок, я вместо этого получал эту ошибку: «org.openqa.selenium.InvalidElementStateException: невозможно выполнить собственное взаимодействие: не удалось загрузить собственный компонент событий». даже если я делаю profile.setEnableNativeEvents(true); для фаерфокса. Я проверю ваши предложения первым делом в понедельник утром, чтобы увидеть, работают ли они, спасибо. - person Mike; 21.07.2012

Может быть, вы можете попробовать selenium.contextMenuAt

person Corinne Kubler    schedule 21.07.2012