डिबगिंग "तत्व बिंदु पर क्लिक करने योग्य नहीं है" त्रुटि


396

मैं इसे केवल क्रोम में देखता हूं।

पूर्ण त्रुटि संदेश पढ़ता है:

"org.openqa.selenium.WebDriverException: तत्व बिंदु (411, 675) पर क्लिक करने योग्य नहीं है। अन्य तत्व क्लिक प्राप्त करेगा: ..."

वह तत्व जो 'क्लिक प्राप्त करेगा' सवाल के तत्व के किनारे पर है, उसके शीर्ष पर नहीं है और इसे ओवरलैप नहीं कर रहा है, पृष्ठ के चारों ओर नहीं घूम रहा है।

मैंने एक ऑफसेट जोड़ने की कोशिश की है, लेकिन वह भी काम नहीं करता है। आइटम स्क्रॉल किए बिना किसी भी प्रदर्शित विंडो पर है।


2
क्या आप पृष्ठ लोड होने की प्रतीक्षा करते हैं? हो सकता है कि पेज लोड होने के दौरान अन्य तत्व इसे ओवरलैप कर दें?
हेरोकिलर

55
उन लोगों के लिए लंबी कहानी जो अभी आ रही है - एलिशन पेज पर दिखाई नहीं दे रहा है और उन पर क्लिक नहीं है। आप विंडो को स्कैन करके देखने का समर्थन करना चाहते हैं।
क्रिस बी।

67
@ ChrisB.Behrens यह हमेशा मामला नहीं है। यह विशेष त्रुटि भी दी जा सकती है जब एक तत्व दूसरे द्वारा कवर किया जाता है। मेरे पास यह अपवाद था जब एक बटन पर क्लिक करने की कोशिश की जा रही थी जो कि निश्चित पोस्ट के साथ एक और तत्व था।
मार्टिन कैसिडी

4
इसकी न केवल Chromedriver- की फ़ायरफ़ॉक्स के साथ भी यही समस्या थी। मैंने पेज को पूरी तरह से फिर से लोड करने के लिए देरी का कार्यान्वयन करके समस्या को ठीक किया, जैसा कि ऊपर दूसरों द्वारा सुझाया गया है।
कोडरविंस

5
मुझे लगता है कि यह स्क्रॉलटो को खाली करने या किसी भी प्रतीक्षा करने के लिए बिल्कुल गलत सलाह है। सेलेनियम क्लिक के एल्गोरिथ्म की तरह दिखता है: 1. तत्व स्थिति की गणना करें। इस स्थिति को स्क्रॉल करें (इसलिए आपको इसे स्वयं जारी करने की आवश्यकता नहीं है) 3. इस स्थिति पर क्लिक करें (अपवाद पिछले दावे से आता है जो यह जांचता है कि तत्व इस पर क्या खड़ा है वास्तविक क्लिक ईवेंट भेजने से ठीक पहले स्थिति) मेरी सलाह है: 1. जांचें कि क्या तत्व आपके व्यूपोर्ट के अंदर है। 2. जांचें कि क्या तत्व किसी अन्य (जैसे चिपचिपा मेनू) द्वारा कवर किया गया है, यदि कोई हो, तो उन्हें छिपाएं या मैन्युअल रूप से बिलिन स्क्रॉलट पर भरोसा किए बिना क्लिक करने से पहले स्क्रॉल करें।
विटालिक वेरोवोडोव

जवाबों:


325

यह 3 प्रकारों के कारण होता है:

1. तत्व क्लिक करने के लिए दिखाई नहीं देता है।

क्लिक करने के लिए इसे बनाने के लिए क्रिया या जावास्क्रिप्ट उपयोग करें।

क्रियाओं द्वारा:

WebElement element = driver.findElement(By("element_path"));

Actions actions = new Actions(driver);

actions.moveToElement(element).click().perform();

JavascriptExecutor द्वारा:

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("scroll(250, 0)"); // if the element is on top.

jse.executeScript("scroll(0, 250)"); // if the element is on bottom.

या

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

फिर तत्व पर क्लिक करें।

2. तत्व को क्लिक करने से पहले पृष्ठ ताज़ा हो रहा है।

इसके लिए, कुछ सेकंड के लिए प्रतीक्षा करने के लिए पृष्ठ बनाएं।

3. तत्व क्लिक करने योग्य है लेकिन इसके शीर्ष पर एक स्पिनर / ओवरले है

नीचे दिए गए कोड का इंतजार होगा जब तक ओवरले गायब नहीं हो जाता

By loadingImage = By.id("loading image ID");

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

फिर तत्व पर क्लिक करें।


52
एक तीसरा प्रकार का कारण है, जो यह है कि आपका तत्व डिव या स्पैन में लिपटा हुआ है। पृष्ठ को पूरी तरह से लोड किया जा सकता है, और पूरी तरह से व्यूपोर्ट के भीतर, लेकिन Chromedriver इसे क्लिक करने से मना कर देगा, जहां FF और IE के लिए वेबड्राइवर का कोई मुद्दा नहीं है। एक वास्तविक मानव का कोई सुराग नहीं है कि स्पैन मौजूद है, और ब्राउज़र को परवाह नहीं है जब आप वास्तव में इसे क्लिक करते हैं, एक मानव के रूप में। न तो इधर-उधर जाना, और न ही इंतजार इस मुद्दे को हल करेगा; क्रोम / क्रोमेड्रिवर से बचें, या पेज के HTML को फिर से लिखना केवल लोगों के लिए एक ही विकल्प लगता है। 3.
डॉन साइमन

54
@ डोनसिमोन मेरे पास वही मुद्दा था जो आपने किया था। मैं इसके द्वारा प्राप्त करने में सक्षम था। इसके बजाय .endKeys (Keys.Return) का उपयोग कर। यह मेरे लिए क्रोम में काम करता था जहां मैं इस मुद्दे पर था और फ़ायरफ़ॉक्स में जहां मुझे इस विशेष लिंक पर एक और समान मुद्दा था (एंकर में लिपटे एंकर)।
पीटर बर्नियर

17
@PeterBernier द्वारा सुझाए गए समाधान उस मामले में अच्छी तरह से काम करते हैं जहां तत्व एक div या एक स्पैन में लपेटा जाता है। Python में मैंने .send_keys ('\ n') का उपयोग किया और क्लिक को अनुकरण करने और Chrome में समस्या के आसपास काम करने के लिए।
जीजे

4
यदि किसी तत्व को div तत्व द्वारा छिपाया जाता है, तो निम्न कोड उसे ठीक करता है। निष्पादित करें जावास्क्रिप्ट ("तर्क [0] .click ();", selenium.findElement (लोकेटर));
EsotericNonsense

आप तत्व के क्लिक होने की प्रतीक्षा भी कर सकते हैं। wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
चिलेस

67

आप जावास्क्रिप्ट क्लिक का भी उपयोग कर सकते हैं और स्क्रॉलिंग की आवश्यकता नहीं होगी।

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);

5
अविश्वसनीय! मुझे आश्चर्य है कि सेलेनियम क्लिक () पद्धति को रद्दी नहीं करता है, जो वे प्रदान करते हैं, यह देखते हुए कि ऐसी स्थितियां हैं जिनमें आइस्डप्लेड () और इनेबल्ड () एक तत्व पर क्लिक करने के लिए पर्याप्त नहीं है, और यह केवल एक समाधान लगता है। धन्यवाद!
जियोवानी बिटलाइनर

2
+1: यह वह समाधान है जो मेरे लिए काम करता है। actions.MoveToElementC # में मेरे लिए काम नहीं किया और अन्य स्क्रॉलिंग समाधानों में थोड़ी नाजुक लग रही थी कि एक मौका था कि स्क्रॉलिंग सही तरीके से तत्व को नहीं देख सकती थी या पृष्ठ पर तत्व की स्थिति बदल सकती थी।
उपयोगकर्ता

1
यह समाधान सबसे आसान है यदि तत्व देखने में नहीं है, लेकिन पृष्ठ पर मौजूद है
यशवीर राणा

@Giovanni बिटलाइनर वे इस विधि को प्रदान नहीं करते हैं क्योंकि यह वास्तविक उपयोगकर्ता परिदृश्य नहीं है। लोडर के गायब होने तक उपयोगकर्ताओं को भी इंतजार करना चाहिए। मुझे लगता है कि सेलेनियम के बारे में एक अद्भुत बात है।
गिदोन मुल्डर

+1 ने भी मेरे लिए काम किया। बस मेरे कोड में जोड़ा flwg विधि: `निजी शून्य jsClick (IWebElement element, IWebDriver ड्राइवर) {IJavaScriptExecutor ex = (IJavaScriptExecutor) ड्राइवर; ex.ExecuteScript ("तर्क [0] .click ();", तत्व); } `इस तरह से आह्वान किया: 'jsClick (driver.FindElement (By.XPath (" xpathOfTheElement "))); `
जेरेमीस

46

वहाँ के लिए chromedriver में एक बग लगता है (समस्या यह है कि यह ठीक नहीं होगा के रूप में चिह्नित है) -> GitHub लिंक

( शायद फ्रीडमस्पॉन्सर्स पर एक इनाम रखें ?)

टिप्पणी # 27 पर सुझाया गया वर्कअराउंड है। शायद यह आपके लिए काम करेगा-


4
उचित लगता है - यदि बटन स्क्रीन पर नहीं है, तो यह वास्तव में क्लिक करने योग्य नहीं है।
इवान नोल्स

यह एक बग नहीं है। यह इच्छित व्यवहार है और यह सही है। जैसा कि अन्य ने सुझाव दिया है, अगर तत्व व्यूपोर्ट के बाहर है - आपको इसे स्क्रॉल करने की आवश्यकता है।
एलेक्स स्क्रीपनीक

मैंने फ़ायरफ़ॉक्स की कोशिश की और पाया कि उसने यह त्रुटि नहीं दी, फिर भी क्लिक को अनदेखा किया गया। यह पता चला कि माता-पिता के तलाक की ऊंचाई शून्य थी। एक बार तय हो गया कि दोनों ने ठीक काम किया है।
डैंसलमो

35

मेरे पास एक ही मुद्दा था, सभी प्रस्तावित समाधानों की कोशिश की, लेकिन उन्होंने मेरे लिए काम नहीं किया। अंततः मैंने इसका उपयोग किया:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));

उम्मीद है की यह मदद करेगा


16

मैंने इसे उस स्थिति में देखा है जब सेलेनियम चालित क्रोम विंडो को बहुत छोटा खोला गया था। क्लिक किया जाने वाला तत्व व्यूपोर्ट से बाहर था और इसलिए यह विफल हो रहा था।

यह तर्कसंगत लगता है ... वास्तविक उपयोगकर्ता को या तो विंडो का आकार बदलना होगा या स्क्रॉल करना होगा ताकि तत्व को देखना संभव हो और वास्तव में उस पर क्लिक करें।

सेलेनियम ड्राइवर को खिड़की के आकार को उचित रूप से सेट करने के निर्देश के बाद यह समस्या मेरे लिए दूर चली गई। वेबड्राइवर एपीआई यहां से हटा दिया गया है


15

वाह, यहाँ बहुत सारे उत्तर, और कई अच्छे।

मुझे उम्मीद है कि मैं अपने अनुभव से इसमें कुछ जोड़ूंगा।

खैर दोस्तों, मेरे मामले में कभी-कभी तत्व को छिपाने वाला एक कुकी ओवरले था। तत्व को स्क्रॉल करना भी काम करता है; लेकिन मेरी विनम्र राय में (मेरे मामले के लिए, सभी के लिए रामबाण नहीं है) सबसे आसान उपाय सिर्फ फुल स्क्रीन पर जाना है (मैं स्क्रीन के 3/4 भाग पर अपनी स्क्रिप्ट चला रहा था)! तो अब हम शुरू करें:

driver.manage().window().maximize();

उम्मीद है की वो मदद करदे!


13

गहरे लाल रंग का / watir-webdriver / क्रोम

मैं निम्नलिखित चाल का उपयोग करता हूं और ऐसा लगता है कि यह काम करता है:

#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"

# click myelement
myelement.when_present.fire_event("click")

1
मैं जिस मुद्दे को देख रहा था वह एक क्षेत्र के नक्शे के साथ था। त्रुटि यहाँ मूल पोस्ट के समान थी - "जिस क्षेत्र पर मुझे क्लिक करने की आवश्यकता थी, उसके सामने एक div"। यह एक AJAX / समय / पृष्ठ लोड मुद्दा नहीं था, और यह क्षेत्र पूर्ण दृश्य में था - मैं इस पर ध्यान केंद्रित करने के लिए स्क्रॉल भी नहीं कर सकता था। हालाँकि, मेरे क्लिक करने के तरीके को ऑब्जेक्ट से बदलकर ऑब्जेक्ट पर क्लिक करें ।fire_event ("क्लिक") लगता है कि मेरे लिए समस्या हल हो गई है। मैंने इसे एक शुरुआत / बचाव खंड में छोड़ दिया ताकि यह संभवतः प्रभावित न हो कि फ़ायरफ़ॉक्स सामान्य रूप से कैसे क्लिक कर रहा है।
अदाम ने

इस दृष्टिकोण ने मेरे लिए इस मुद्दे के आसपास काम किया जब व्यूपोर्ट में तत्व नहीं थे।
जेसन आर। कोम्ब्स

13

मैं भी इस समस्या से जूझ रहा हूं। कोड एफएफ में ठीक काम करता है, क्रोम पर विफल रहता है। जो मैं करने की कोशिश कर रहा था वह एक टिकबॉक्स क्लिक करने के लिए था - अगर यह देखने में नहीं था, तो मैं देखने के लिए स्क्रॉल करूंगा और फिर क्लिक करूंगा। यहां तक ​​कि क्रोम में देखने के काम में स्क्रॉल करते हुए, टिकबॉक्स के केवल नीचे के कुछ पिक्सेल दिखाई नहीं देते थे, इसलिए वेबड्राइवर ने उस पर क्लिक करने से इनकार कर दिया।

मेरा समाधान यह है:

WebElement element = _sectorPopup.findElement(...);

((Locatable) element).getCoordinates().inViewPort();
try {
    element.click();
} catch (Exception e) {
    new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
    element.click();
}

Chrome को सेंडके के साथ भी समस्याएँ हैं, क्रियाओं का उपयोग करना कभी-कभी आवश्यक होता है। जाहिर है, आपको यह जानने की जरूरत है कि आपका माइलेज किस दिशा में और कितनी दूरी तक जाने की जरूरत है। लेकिन मैं इसे जावास्क्रिप्ट हैक के लिए पसंद करता हूं, इसलिए मैं इसे यहां पोस्ट कर रहा हूं अगर कोई और इसे उपयोगी पाएगा।


स्थानिक को हटा दिया गया है।
स्टीव स्टेपल

12

मुझे यह त्रुटि तब हो रही थी जब xvfb- रन के साथ हेडलेस परीक्षण चला रहा था। वे स्थानीय स्तर पर त्रुटिपूर्ण काम कर रहे थे। क्रोम, वेबड्राइवर / क्रोमेड्रिवर / क्रोम / जावा आदि के संस्करण का उपयोग करना।

क्रोमेड्रिवर में बग को ठीक नहीं किया जाएगा - टोनी लम्पाडा ने बताया कि गिटहब लिंक ने सुझाव दिया कि यह स्क्रीन पर दिखाई नहीं दे रहा है / से संबंधित हो सकता है।

Xvfb- रन के लिए मदद संदेश निम्न दिखाता है:

-s ARGS   --server-args=ARGS    arguments (other than server number and
                                "-nolisten tcp") to pass to the Xvfb server
                                (default: "-screen 0 640x480x8")

Xvfb के लिए रिज़ॉल्यूशन बदलने से त्रुटि दूर हो गई:

xvfb-run -s "-screen 0 1280x1024x16" ...

9

प्रोट्रैक्टर का उपयोग करते समय इससे मुझे मदद मिली:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();

8

सबसे पहले, नवीनतम Chrome ड्राइवर प्राप्त करने का प्रयास करें और जांचें कि क्या यह समस्या हल करता है।

मेरे मामले में, इसने समस्या को ठीक नहीं किया। लेकिन, निम्नलिखित समाधान ने मेरे लिए अब तक काम किया। निम्नलिखित C # कोड है लेकिन आप अपनी विशिष्ट भाषा में उसी तर्क का पालन कर सकते हैं। हम यहाँ क्या करते हैं,

चरण 1: सेलेनियम क्रियाएं ऑब्जेक्ट का उपयोग करने वाले तत्व पर ध्यान दें,

चरण 2: फिर तत्व पर एक क्लिक करें

चरण 3: यदि कोई अपवाद है, तो हम जावास्क्रिप्ट स्क्रिप्ट को सेलेनियम ब्राउज़र ड्राइवर के "एक्सेक्यूटस्क्रिप्ट" विधि के माध्यम से जावास्क्रिप्ट स्क्रिप्ट निष्पादित करके तत्व पर "ईवेंट" घटना को ट्रिगर करते हैं।

आप चरण 1 और 2 को भी छोड़ सकते हैं और केवल चरण 3 को भी आज़मा सकते हैं। चरण 3 इस पर काम करेगा, लेकिन मैंने एक अजीब स्थिति में कुछ अजीब व्यवहार देखा, जिसमें चरण 3, भले ही उसने तत्व को सफलतापूर्वक क्लिक किया, तत्व को क्लिक करने के बाद मेरे कोड के अन्य भागों में अप्रत्याशित व्यवहार हुआ।

            try
            {
                //Setup the driver and navigate to the web page...
                var driver = new ChromeDriver("folder path to the Chrome driver");
                driver.Navigate().GoToUrl("UrlToThePage");

                //Find the element...
                var element = driver.FindElement(By.Id("elementHtmlId")); 

                //Step 1
                new Actions(driver).MoveToElement(element).Perform();  

                //Step 2
                element.Click();
            }
            catch (Exception)
            {
                //Step 3
                driver.ExecuteScript("document.getElementById('elementHtmlId').click();");

            }

मैं एक ही मुद्दा रहा था। एक्शन क्लास का उपयोग करने का आपका चरण 1 महान काम करता है। मैंने ऐसा कभी नहीं सोचा होगा। धन्यवाद!
कॉनर

आपका पहला कदम एक महान समाधान है।
सोवंदरा LENG

7

मैंने टोनी लैम्पाडा के जवाब से एक टिप्पणी के आधार पर यह विधि बनाई। ये अच्छी तरह काम करता है।

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end

6

मुझे अजगर में सेलेनियम स्क्रिप्ट चलाने के दौरान एक ही मुद्दा मिल रहा था। यहाँ मैं तत्व पर क्लिक करने के लिए प्रयोग किया जाता है:

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()

5

मैं एक समान समस्या का सामना कर रहा था, मुझे एक के बाद एक दो चेक बॉक्सों की जाँच करनी है। लेकिन मैं त्रुटि के ऊपर एक ही हो रहा था। मैंने चेकबॉक्स की जाँच के लिए अपने कदमों के बीच प्रतीक्षा को जोड़ा .... इसका काम ठीक है और महान। यहाँ कदम हैं: -

  When I visit /administrator/user_profiles
  And I press xpath link "//*[@id='1']"
  Then I should see "Please wait for a moment..."
  When I wait for 5 seconds
  And I press xpath link "//*[@id='2']"
  Then I should see "Please wait for a moment..."
  When I visit /administrator/user_profiles_updates

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

5

आपको उस तत्व पर ध्यान केंद्रित करने या स्क्रॉल करने की आवश्यकता है। आपको अन्वेषण प्रतीक्षा का उपयोग भी करना पड़ सकता है।

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

या

इसके शीर्ष पर स्पिनर / ओवरले के कारण तत्व क्लिक करने योग्य नहीं है:

By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

या

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

या

अगर फिर भी काम न हो JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);

3

जाहिर तौर पर यह क्रोम ड्राइवर बाइनरी में "W't Fix" बग का परिणाम है।

एक समाधान जो मेरे लिए काम किया (हमारा माइलेज मई वैरी) इस Google समूह चर्चा में पाया जा सकता है, टिप्पणी # 3:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

संबंधित भाग यहीं है:

जब से मैंने इस मुद्दे के आसपास काम किया है सीधे स्पैन के मूल लंगर के हाइपर पर नेविगेट कर रहा हूं।

। Driver.Navigate () GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)) FindElement (By.XPath ( "..")) getAttribute ( "href")।।);

मेरे मामले में, मैं अजगर का उपयोग कर रहा हूं, इसलिए एक बार जब मुझे वांछित तत्व मिल गया, तो मैंने बस उपयोग किया

driver.get(ViewElm.get_attribute('href'))

मैं यह केवल काम करने की उम्मीद करूंगा, हालांकि, यदि आप जिस तत्व पर क्लिक करने की कोशिश कर रहे हैं वह एक लिंक है ...


3

मैं clj-webdriver (सेलेनियम के क्लोजर पोर्ट) के साथ एक ही समस्या का सामना कर रहा था । मैंने सुविधा के लिए क्लोजर करने के लिए पिछले समाधान का अनुवाद किया। क्लिक करने से पहले या इस समस्या से बचने के लिए आप इस फ़ंक्शन को कॉल कर सकते हैं।

(defn scrollTo
  "Scrolls to the position of the given css selector if found"
  [q]
  (if (exists? q) 
    (let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ] 
      (execute-script jscript))))

3

यह तब हो सकता है यदि ड्राइवर स्थिति में बदलाव करता है जबकि चालक इसे क्लिक करने का प्रयास कर रहा है (मैंने इसे IE के साथ भी देखा है)। ड्राइवर प्रारंभिक स्थिति को बनाए रखता है, लेकिन जब तक वह वास्तव में उस पर क्लिक करने के लिए नहीं हो जाता, तब तक वह स्थिति उस तत्व की ओर इशारा नहीं करती है। फ़ायर्फ़ॉक्स ड्राइवर में यह समस्या बीटीडब्ल्यू नहीं है, जाहिर है कि यह प्रोग्राम को "क्लिक" करता है।

वैसे भी, यह तब हो सकता है जब आप एनिमेशन का उपयोग करते हैं या बस तत्वों की ऊंचाई को गतिशील रूप से बदलते हैं (जैसे $("#foo").height(500))। आपको यह सुनिश्चित करने की आवश्यकता है कि उनकी ऊंचाई "व्यवस्थित" होने के बाद ही आप तत्वों पर क्लिक करें। मैं कोड के साथ समाप्त हुआ जो इस तरह दिखता है (C # बाइंडिंग):

if (!(driver is FirefoxDriver))
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
        d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}

एक एनीमेशन या किसी अन्य कारक के मामले में आप आसानी से क्वेरी नहीं कर सकते हैं, आप एक "सामान्य" विधि का उपयोग कर सकते हैं जो तत्व के स्थिर होने की प्रतीक्षा करता है:

var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d => 
{
    var e = driver.FindElement(By.Id(someId));
    if (e.Location == prevLocation)
    {
        stationaryCount++;
        return stationaryCount == desiredStationarySamples;
    }

    prevLocation = e.Location;
    stationaryCount = 0;
    return false;
});

यह वही प्रतीत होता है जो मैं अनुभव कर रहा हूं। मुझे रुक-रुक कर ओपी का "अन्य तत्व मिलेगा ..." अपवाद है, लेकिन स्क्रीनशॉट दिखाते हैं कि मोडल स्क्रीन पर है और तत्व कवर नहीं है और मैं क्लिक करने से पहले प्रतीक्षा का उपयोग करता हूं। जब मैं जिस मोडल पर क्लिक कर रहा हूं, वह खुलता है तो यह वास्तव में पेज को स्लाइड करता है। जब सेलेनियम वास्तविक नमूनों को डोम के रूप में प्रतीक्षा करता है, तो यह अपवाद हो सकता है कि अगर यह चल रहा है तो यह मोडल को पकड़ सकता है।
लेवी नोएकर

3

मुझे यह मिला क्योंकि इस तत्व पर एक लोडिंग संवाद कवर। मैं सरल रूप से इस तत्व के साथ काम करने से पहले एक प्रतीक्षा जोड़कर हल करता हूं।

try {
        Thread.sleep((int) (3000));
    } catch (InterruptedException e) {
        //
        e.printStackTrace();
    }

उममीद है कि इससे मदद मिलेगी!


3

त्रुटि संदेश की व्याख्या :

त्रुटि संदेश बस कहता है, कि जिस तत्व पर आप क्लिक करना चाहते हैं वह मौजूद है, लेकिन यह दिखाई नहीं दे रहा है। यह कुछ द्वारा कवर किया जा सकता है या अस्थायी दिखाई नहीं दे सकता है।

परीक्षण के क्षण में तत्व दिखाई नहीं देने के कई कारण हो सकते हैं। कृपया अपने पृष्ठ का पुनः विश्लेषण करें और अपने मामले का उचित समाधान निकालें।

विशेष मामले के लिए समाधान :

मेरे मामले में, यह त्रुटि तब होती है, जब स्क्रीन तत्व का एक टूलटिप जिसे मैंने अभी क्लिक किया था, उस तत्व पर पॉपिंग कर रहा था जिसे मैं अगला क्लिक करना चाहता था। डिफोकस एक समाधान था जिसकी मुझे आवश्यकता थी।

  • डिफोकस करने का त्वरित समाधान स्क्रीन के दूसरे भाग में किसी अन्य तत्व पर क्लिक करना होगा जो "कुछ भी नहीं" का सम्मान करता है। क्लिक एक्शन के बाद कुछ नहीं होता है।
  • element.blur()टूलटिप को जोड़ने वाले तत्व को कॉल करने के लिए उचित समाधान होगा , जो टूलटिप को गायब कर देगा।

3

इस त्रुटि का कारण यह है कि जिस तत्व को आप क्लिक करने का प्रयास कर रहे हैं वह ब्राउज़र के व्यूपोर्ट (क्षेत्र में उपयोगकर्ता द्वारा देखा गया) में नहीं है। तो इसे दूर करने का तरीका पहले वांछित तत्व पर स्क्रॉल करना और फिर क्लिक करना है।

जावास्क्रिप्ट:

async scrollTo (webElement) {
    await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
    await this.driver.executeScript('window.scrollBy(0,-150)')
}

जावा:

public void scrollTo (WebElement e) {
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
    js.executeAsyncScript('window.scrollBy(0,-150)')
}

2

टोनी लाम्पाडा का जवाब, टिप्पणी # 27 ने वास्तव में मेरे लिए समस्या का समाधान किया, सिवाय इसके कि उसने जावा कोड प्रदान किया और मुझे पायथन की आवश्यकता थी। यहां एक पायथन फ़ंक्शन है जो तत्व की स्थिति को स्क्रॉल करता है और फिर इसे क्लिक करता है।

def scroll_to_and_click(xpath):
    element = TestUtil.driver.find_element_by_xpath(xpath)
    TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
    element.click()

इससे क्रोम 34.0 में मेरे लिए समस्या हल हो गई। यह फ़ायरफ़ॉक्स 28.0 और IE 11 में कोई नुकसान नहीं पहुंचा; वे ब्राउज़र समस्या के अधीन नहीं हैं, लेकिन क्लिक करने से पहले तत्व की स्थिति तक स्क्रॉल करना अभी भी कोई बुरी बात नहीं है।


2

शायद यह वास्तव में साफ समाधान नहीं है, लेकिन यह काम करता है:

try:
    el.click()
except WebDriverException as e:
    if 'Element is not clickable at point' in e.msg:
        self.browser.execute_script(
            '$("{sel}").click()'.format(sel=el_selector)
        )
    else:
        raise

2

मुझे यह बग मिल रहा था क्योंकि मैंने एक होवर का परीक्षण किया था और फिर टूलटिप के नीचे दिए गए लिंक पर क्लिक करने की आवश्यकता थी। टूलटिप को रास्ते से हटाने के लिए समाधान को page.find('.sp-logo').hoverपहले जोड़ना था click_link


2

यह हास्यास्पद है, हर समय मैंने विभिन्न प्रतिक्रियाओं को देखा, किसी ने भी स्पष्ट करने की कोशिश नहीं की थी, जो निश्चित रूप से, मैंने भी नहीं किया था। यदि आपके पृष्ठ में एक ही आईडी का कई बार उपयोग किया गया है, जैसा कि मेरा किया था, ("newButton"), और जो आप चाहते हैं वह पहले वाला नहीं है, तो आप सभी संभावना में इस त्रुटि को प्राप्त करेंगे। सबसे आसान काम (C #):

var testIt = driver.FindElements(By.Id("newButton"));

ध्यान दें कि यह FindElements है, FindElement नहीं।

और फिर यह देखने के लिए परीक्षण करें कि पुनर्प्राप्ति से कितने परिणाम वापस आए। यदि यह दूसरा है, तो आप उपयोग कर सकते हैं:

testit[1].Click();

या उन्हें ठीक करने के लिए पूर्ण आईडी का उपयोग करें।


यदि ऐसा इसलिए है क्योंकि उस आईडी के कई बटन हैं और केवल एक ही समय में प्रदर्शित किया जाता है, तो एक बेहतर समाधान में .First(x => x.Visible)लिनेक्यू का उपयोग करना शामिल है जो पहला तत्व दिखाई देता है ( फाइंडलाइल्स कॉल में जोड़ें ) और उस पर क्लिक करें यदि यह शून्य नहीं है।
सीन डगगन

2

सभी उल्लिखित सुझावों का परीक्षण करने के बाद, कुछ भी काम नहीं किया। मैंने यह कोड बनाया है। यह काम करता है, लेकिन सुंदर नहीं है

public void click(WebElement element) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            element.click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}

public void click(String css) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            driver.findElement(By.cssSelector(css)).click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}

2

मैं क्लिकों की एक तरह की पाशविक शक्ति करता हूं और यह मेरे लिए काम करता है।

try:
    elem.click()
except:
    print "failed to click"
    size = elem.size
    mid_of_y = int(size["height"])/2
    stepts_to_do_to_left = int(size["width"])
    while stepts_to_do_to_left > 0:
        try:
            print stepts_to_do_to_left, mid_of_y
            action = webdriver.common.action_chains.ActionChains(driver)
            action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
            action.click()
            action.perform()
            print "DONE CLICK"
            break
        except:
            pass

2

यदि आपने jQueryपृष्ठ पर लोड किया है, तो आप निम्नलिखित जावास्क्रिप्ट कमांड निष्पादित कर सकते हैं:

"$('#" + element_id + "').click()"

अजगर निष्पादनकर्ता का उपयोग करने वाला उदाहरण:

driver.execute_script("$('#%s').click()" % element_id)

1

मुझे भी यही समस्या थी और यह div और div के अंदर लिंक के बीच एक संघर्ष के कारण हुआ था। इसलिए ड्राइवर उस लिंक पर क्लिक कर रहा था जो मुझे चाहिए था। मैंने div id बदल दी और इसने ठीक से काम किया।

इससे पहले:

<div id="logout"><a id="logout" href="logoutLink">logout</a></div>

उपरांत:

<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>

आश्चर्य नहीं है कि आप मुद्दों का कारण बना। एक पेज पर केवल एक आईडी होनी चाहिए। यह खराब डिजाइन नहीं एक समाधान था।
डेव लॉरेंस

1

सेलेनियम का उपयोग करते समय ड्रुपल में :

    // Get element.
    $element = $this->driver->getElement('xpath=//input');        
    // Get screen location.
    $location = $element->getLocation();
    // To make sure that Chrome correctly handles clicking on the elements 
    // outside of the screen, we must move the cursor to the element's location.
    $this->driver->moveCursor($location['x'], $location['y']);

    // Optionally, set some sleep time (0.5 sec in the example below) if your
    // elements are visible after some animation.
    time_nanosleep(0, 500000000);

    // Click on the element.
    $element->click();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.