जावा का उपयोग करके सेलेनियम वेबड्राइवर में माउसओवर फ़ंक्शन कैसे करें?


132

मैं एक ड्रॉप डाउन मेनू पर माउसओवर फ़ंक्शन करना चाहता हूं। जब हम मेनू पर होवर करते हैं, तो यह नए विकल्प दिखाएगा। मैंने xpath का उपयोग करके नए विकल्पों पर क्लिक करने का प्रयास किया। लेकिन सीधे मेनू पर क्लिक नहीं कर सकते। इसलिए, मैनुअल तरीके से मैं ड्रॉप डाउन मेनू पर मंडराने की कोशिश कर रहा हूं और फिर नए विकल्पों पर क्लिक करूंगा।

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).build().perform();

- विस्तृत जवाब के लिए इस साइट की जाँच करें testautomationguru.com/...
vins

जवाबों:


116

इसके लिए 'माउस होवर' क्रिया करना वास्तव में संभव नहीं है, इसके बजाय आपको उन सभी कार्यों को श्रृंखलाबद्ध करने की आवश्यकता है जिन्हें आप एक बार में प्राप्त करना चाहते हैं। इसलिए उस तत्व को स्थानांतरित करें जो दूसरों को प्रकट करता है, फिर उसी श्रृंखला के दौरान, अब सामने आए तत्व पर जाएं और उस पर क्लिक करें।

एक्शन चेन्स का उपयोग करते समय आपको 'यह एक उपयोगकर्ता की तरह होगा' याद रखना होगा।

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).moveToElement(webdriver.findElement(By.xpath("/expression-here"))).click().build().perform();

5
मेरे लिए यह काम नहीं करता है। मेरा मेनू केवल तभी मँडरा जाता है जब मैं एक निर्माण () प्रदर्शन करता हूँ। () एक चाल के बाद ()
गारफील्डकॉन

8
कारण यह है कि यह काफी काम नहीं करेगा कि सभी कॉलों को webdriver.findElement(By... something)किसी और चीज से पहले निष्पादित किया जाए (यह एकमात्र तरीका है कि उनका परिणाम पास किया जा सकता है moveElement)। उस समय दूसरा तत्व जिसे आप ढूंढना चाहते हैं वह अभी तक दिखाई नहीं दे रहा है क्योंकि पहले वाले को अभी भी मँडराया जाना है। इसे ठीक करने के लिए, जैसा कि आपने कहा था, आप मध्यवर्ती .perform()एस सम्मिलित कर सकते हैं , फिर दूसरे के लिए findElement, पहला होवर performएड हो गया होगा । दिए गए समाधान पृष्ठ के कार्यान्वयन के आधार पर काम कर सकते हैं, लेकिन जाहिर तौर पर आपके और मेरे लाभ में अंतर है।
Sander Verhagen

57

निम्नलिखित में से कोई भी जवाब काम नहीं करता है:

  1. एक मेनू आइटम पर होवर करें।
  2. छिपे हुए तत्व का पता लगाएं जो होवर के बाद ही उपलब्ध है।
  3. उप-मेनू आइटम पर क्लिक करें।

यदि आप MoveToElement के बाद एक 'प्रदर्शन' कमांड डालते हैं, तो यह तत्व में चला जाता है, और उप-मेनू आइटम एक संक्षिप्त अवधि के लिए दिखाता है, लेकिन यह एक मंडराना नहीं है। एलिमेंटनॉट फ़ाउंड एक्ससेप्शन के परिणामस्वरूप छिपे हुए तत्व तुरंत गायब हो जाते हैं। मैंने दो चीजों की कोशिश की:

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
builder.moveToElement(clickElement).click().perform();

इसने मेरे लिए काम नहीं किया। निम्नलिखित ने मेरे लिए काम किया:

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
By locator = By.id("clickElementID");
driver.click(locator);

होवर और मानक WebDriver क्लिक करने के लिए क्रियाओं का उपयोग करना, मैं होवर कर सकता हूं और फिर क्लिक कर सकता हूं।


3
दूसरा उदाहरण मेरे लिए काम करने के साथ-साथ .perform ()
TheRed__

1
खिचड़ी भाषा यह अभी भी एक मुद्दा है ... यह भी काम नहीं करता है: buildder.moveToElement (सेटिंग्स) .moveByOffset (0, 30) .MoveToElement (स्टेजिंगमेनू) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu)। .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); मैं भी समयबाह्य अवधि में तत्व पर मंडराना सीएसएस ट्रिगर देखा। लेकिन कोई क्लिक triggerd हो जाता है कोई बात नहीं मैं क्या कोशिश
Sangoku

यदि क्लिक करने योग्य सामान्य तत्व नहीं है तो आप इसे कैसे संभालेंगे और यह :: पहले आता है । जब आप हॉवर करते हैं तो यह पहले दिखाई देता है
अशोक कुमार गणेशन

25

इस ब्लॉग पोस्ट के आधार पर मैं सेलेनियम 2 वेबड्राइवर के साथ निम्नलिखित कोड का उपयोग करके मंडराने में सक्षम था:

String javaScript = "var evObj = document.createEvent('MouseEvents');" +
                    "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);" +
                    "arguments[0].dispatchEvent(evObj);";


((JavascriptExecutor)driver).executeScript(javaScript, webElement);

2
कम स्पष्ट समाधान, लेकिन मेरे IE11 परीक्षण के लिए 100% ठोस। यदि आपको समस्या हो रही है moveToElement, तो इसका उपयोग करें! मैं C # में कोड करता हूं, इसलिए इसे करने का केवल जावा तरीका नहीं है।
vt100

सेलेनियम माउस क्रियाएँ और इंतजार , जावास्क्रिप्ट initMouseEvent () Example
यश

यह क्या है arguments[0]?
एरियन

@ArianHosseinzadeh ने डोम के संदर्भ में पारित दूसरे तर्क को पारित किया executeScript(), जो कि एक हैwebElement
जुगवाल्ट

मुझे जावास्क्रिप्ट निष्पादक के लिए मिसेज़ रेफरी मिलता है। C #
mark1234

11

यह कोड पूरी तरह से अच्छी तरह से काम करता है:

 Actions builder = new Actions(driver);
 WebElement element = driver.findElement(By.linkText("Put your text here"));
 builder.moveToElement(element).build().perform();

माउस खत्म होने के बाद, आप उसके बाद की गई जानकारी पर अगली कार्रवाई करना चाहते हैं


बहुत बढ़िया बस जोड़ना थाusing OpenQA.Selenium.Interactions;
सुशीग्यु

7

इस उदाहरण को जांचें कि हम इसे कैसे लागू कर सकते हैं।

यहाँ छवि विवरण दर्ज करें

public class HoverableDropdownTest {

    private WebDriver driver;
    private Actions action;

    //Edit: there may have been a typo in the '- >' expression (I don't really want to add this comment but SO insist on ">6 chars edit"...
    Consumer < By > hover = (By by) -> {
        action.moveToElement(driver.findElement(by))
              .perform();
    };

    @Test
    public void hoverTest() {
        driver.get("https://www.bootply.com/render/6FC76YQ4Nh");

        hover.accept(By.linkText("Dropdown"));
        hover.accept(By.linkText("Dropdown Link 5"));
        hover.accept(By.linkText("Dropdown Submenu Link 5.4"));
        hover.accept(By.linkText("Dropdown Submenu Link 5.4.1"));
    }

    @BeforeTest
    public void setupDriver() {
        driver = new FirefoxDriver();
        action = new Actions(driver);
    }

    @AfterTest
    public void teardownDriver() {
        driver.quit();
    }

}

विस्तृत उत्तर के लिए, यहाँ देखें - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/


5

मुझे यह प्रश्न मेरे जावास्क्रिप्ट परीक्षणों के लिए एक ही काम करने के तरीके की तलाश में मिला, प्रोटेक्टर (सेलेनियम के लिए एक जावास्क्रिप्ट दृश्यपटल) का उपयोग करते हुए।

1.2.0 प्रोटेक्टर के साथ मेरा समाधान और वेबड्राइवर 2.1:

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
)
.click()
.perform();

यह भी एक ऑफसेट स्वीकार करता है (मैं एक तत्व के ऊपर और बाईं ओर क्लिक करने के लिए इसका उपयोग कर रहा हूं :)

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
  , -20, -20  // pixel offset from top left
)
.click()
.perform();

4

सेलेनियम जावा वेबड्राइवर का उपयोग करके माउस होवर का नमूना कार्यक्रम:

public class Mhover {
    public static void main(String[] args){
       WebDriver driver = new FirefoxDriver();
       driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
       driver.get("http://www.google.com");
       WebElement ele = driver.findElement(By.id("gbqfba"));
       Actions action = new Actions(driver);
       action.moveToElement(ele).build().perform();
    }
}

9
कृपया कोड को पोस्ट करने के बजाय अपने उत्तर के बारे में कुछ जानकारी सहित विचार करें। हम न केवल 'सुधार' प्रदान करने की कोशिश करते हैं, बल्कि लोगों को सीखने में मदद करते हैं। आपको यह बताना चाहिए कि मूल कोड में क्या गलत था, आपने अलग-अलग क्या किया, और आपके परिवर्तन ने क्या काम किया।
एंड्रयू बार्बर

2
@AndrewBarber - दिया गया कार्यक्रम वास्तव में उपयोगकर्ता की मदद कर सकता है। वह कार्यक्रम उचित कार्य कर रहा है। उपयोगकर्ता ने पहले ही स्वीकार कर लिया है कि ..
हेल्पिंग हैंड्स

4
मैं विवाद नहीं करता यह काम करेगा ; मैं कह रहा हूं कि आपको यह समझाना चाहिए कि यह क्यों काम कर सकता है, क्यों वे जो काम नहीं कर रहे थे, और आपने क्या बदल दिया।
एंड्रयू नाई

यह कोड ओपी के बराबर है और इस सवाल का जवाब नहीं देता है। बिना किसी प्रासंगिक जानकारी के, यह बहुत ही शानदार है।
jpaugh

2

तुम कोशिश कर सकते हो:

WebElement getmenu= driver.findElement(By.xpath("//*[@id='ui-id-2']/span[2]")); //xpath the parent

Actions act = new Actions(driver);
act.moveToElement(getmenu).perform();

Thread.sleep(3000);
WebElement clickElement= driver.findElement(By.linkText("Sofa L"));//xpath the child
act.moveToElement(clickElement).click().perform();

यदि आपके पास मामला था तो वेब में कई श्रेणी हैं, पहली विधि का उपयोग करें। आपके इच्छित मेनू के लिए, आपको बस दूसरी विधि चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.