Не може да се щракне с десния бутон, 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. Моля, помогнете ми.

РЕДАКТИРАНЕ: Благодарение на съвета на Slanec и повече бъркане с инструмента за създаване на действия, открих, че проблемът е в това, че моят selenium webdriver не е актуален за Firefox 14. Странно е, като се има предвид, че мислех, че съм изтеглил най-новия точно миналия четвъртък . Така или иначе, очевидно естествената поддръжка на събития за Firefox 14 не е добавена до webdriver 2.25.0, а аз използвам 2.24.1.


person Mike    schedule 20.07.2012    source източник
comment
Вижте дали тази публикация помага stackoverflow. com/questions/7647154/   -  person anazimok    schedule 21.07.2012
comment
уви, това вече го пробвах. Получавам: Изключение в главната нишка 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, където се намират всички други методи (замаскирани класове чрез модела на командата). Най-вероятно не е бил пренесен към 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); за Firefox. Ще тествам вашите предложения първо в понеделник сутринта, за да видя дали има работа, благодаря. - person Mike; 21.07.2012

Може би можете да опитате selenium.contextMenuAt

person Corinne Kubler    schedule 21.07.2012