सेलेनियम वेबड्राइवर को उस तत्व पर क्लिक करने के लिए कैसे मजबूर करें जो वर्तमान में दिखाई नहीं दे रहा है?


99

मैं फ़ायरफ़ॉक्सड्राइवर के साथ सेलेनियम 2 जावा एपीआई का उपयोग कर रहा हूं। जब मैं एक फॉर्म भरता हूं, तो प्रपत्र इनपुट के आधार पर पृष्ठ पर चेकबॉक्स जोड़े जाते हैं।

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

"Element is not currently visible and so may not be interacted with"

क्या मैं सेलेनियम को तत्वों की गैर-दृश्य स्थिति को अनदेखा करने के लिए मजबूर कर सकता हूं? मैं गैर-दृश्य तत्व के साथ बातचीत करने के लिए सेलेनियम को कैसे मजबूर कर सकता हूं?


आप कौन सा ब्राउज़र उपयोग कर रहे हैं? आप उन तत्वों के साथ बातचीत नहीं कर सकते जो अक्षम हैं या दिखाई नहीं दे रहे हैं क्योंकि एक अंतिम उपयोगकर्ता उनके साथ बातचीत करने में सक्षम नहीं होगा। यदि आप चाहते हैं कि मैं इस समस्या का निदान और निदान करूँ तो आपको अपना परीक्षण कोड और पृष्ठ स्रोत प्रदान करना होगा।
Ardesco

जवाबों:


102

सेलेनियम निर्धारित करता है कि कोई तत्व दिखाई दे रहा है या नहीं, निम्न मानदंडों द्वारा (यह निर्धारित करने के लिए कि आपके तत्व पर css क्या लागू होता है, यह निर्धारित करने के लिए DOM निरीक्षक का उपयोग करें, सुनिश्चित करें कि आप गणना की गई शैली को देखते हैं):

  • दृश्यता! = छिपा हुआ
  • प्रदर्शन! = कोई नहीं (प्रत्येक मूल तत्व के विरुद्ध भी जाँच की जाती है)
  • अपारदर्शिता! = 0 (यह एक तत्व क्लिक करने के लिए जाँच नहीं है)
  • ऊंचाई और चौड़ाई दोनों> 0 हैं
  • एक इनपुट के लिए, विशेषता प्रकार! = छिपा हुआ

आपका तत्व उन मानदंडों में से एक से मेल खा रहा है। यदि आपके पास तत्व की स्टाइल को बदलने की क्षमता नहीं है, तो यहां बताया गया है कि आप इसे कैसे जावास्क्रिप्ट के साथ कर सकते हैं (वेबड्राइवर को संभालने जा रहे हैं क्योंकि आपने सेलेनियम 2 एपीआई कहा है):

((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);

लेकिन यह एक जावास्क्रिप्ट ईवेंट को आग नहीं देगा, यदि आप उस इनपुट के लिए परिवर्तन ईवेंट पर निर्भर करते हैं, तो आपको इसे भी फायर करना होगा (ऐसा करने के कई तरीके, उस पेज पर जो भी जावास्क्रिप्ट लाइब्रेरी भरी हुई है, उसका उपयोग करना सबसे आसान है)।

दृश्यता जांच के लिए स्रोत -

https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577

WebDriver युक्ति जो इसे परिभाषित करता है -

https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#widl-WebElement-isDisplayed-boolean


1
क्या आपके पास शर्तों की सूची के लिए एक स्रोत (या विहित लिंक) है?
एमजे

2
जब तक आप जावास्क्रिप्ट पढ़ सकते हैं, विधि bot.dom.isShown क्या दृश्यता का निर्धारण करती है: code.google.com/p/selenium/source/browse/trunk/javascript/atoms/...
lukeis

यहाँ inputElement क्या है। मैं नीचे दिए गए कोड को WebElement inputElement = driver.findElement (By.xpath (PASSWORD_PATH)) चलाता हूं; ((JavascriptExecutor) ड्राइवर) .executeScript ("तर्क [0] .checked = true;", inputElement); लेकिन No Help inputElement.sendKeys (पासवर्ड);
दीपक गोयल

2
@NIleshSharma python ने मेथड एग्जीक्यूट_सस्क्रिप्ट को सीधे ड्राइवर ऑब्जेक्ट पर ही किया है: Driver.execute_script (...)
lukeis

1
@TunaBum द्वारा पोस्ट किए गए स्रोत लिंक को बदलकर code.google.com/p/selenium/source/browse/javascript/atoms/…
Shepmaster

27

कभी-कभी इसका मतलब है कि एक पृष्ठ पर कई तत्व हैं जिनके पास समान संपत्ति है जिसे आप खोज कर रहे हैं और आप "गलत से बात कर रहे हैं"।

यदि आपके तत्व को विशिष्ट रूप से पहचान नहीं किया जा सकता है: आईडी या: नाम (या: वर्ग), तो यह मुश्किल हो सकता है।

कभी-कभी द्वारा तत्व की खोज करना: xpath मदद करेगा और कुछ मामलों में भी व्यावहारिक नहीं होगा।

उन मामलों में, आपको उन सभी तत्वों को प्राप्त करना पड़ सकता है जो आपके मानदंडों से मेल खाते हैं और सूचकांक द्वारा सही एक का संदर्भ देते हैं। यह गंदा है, लेकिन यह काम करता है।

मैं रूबी एप्लिकेशन पर रूबी से सेलेनियम / वाटर का उपयोग कर रहा हूं, इसलिए मेरे मामले में उदाहरण होगा:

browser = Watir::Browser.new(:firefox, :profile => "default")       
browser.goto("http://www.google.com/analytics")
# login
browser.divs(:text, "+ New Property").last.click

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


एक आईडी को डोम एलिमेंट में जोड़ना मेरे लिए तय है
नौरु

मेरे पास एक ही मुद्दा था और XPath को समायोजित करना ताकि यह एक अद्वितीय तत्व को अलग कर सके ताकि चाल चल सके।
जॉनएल

मुझे भी यही समस्या थी। मैचों को खोजने के लिए findElements () में परिवर्तित कॉल और एक और मेल खाने वाला तत्व था। धन्यवाद!
मेष राशि

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

14

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

driver.maximize_window()

देखें: WebDriver.maximize_window ()


7

या आप उपयोगकर्ता इंटरैक्शन का अनुकरण करने के लिए सेलेनियम एक्शन क्लास का उपयोग कर सकते हैं - उदाहरण के लिए

    WebDriver = new FirefoxDriver();

    WebElement menu = driver.findElement(By.xpath("")); // the triger event element

    Actions build = new Actions(driver); // heare you state ActionBuider
    build.moveToElement(menu).build().perform(); // Here you perform hover mouse over the needed elemnt to triger the visibility of the hidden
    WebElement m2m= driver.findElement(By.xpath(""));//the previous non visible element
    m2m.click();

7

एक अन्य मामला भी है जब दृश्य तत्व को दृश्यमान नहीं होने के रूप में पहचाना जाएगा:

  • जब तत्व सीएसएस रूपांतरित हो जाता है
  • जब मूल तत्व का मूल तत्व सीएसएस रूपांतरित हो जाता है

यह जांचने के लिए कि क्या आप जिस तत्व के साथ सहभागिता नहीं करना चाहते हैं वह सीएसएस रूपांतरित है, CHROME पर ऐसा करें:

  1. खुला निरीक्षक
  2. दिलचस्प तत्व खोजें (या इसके मूल तत्व की संभावना, माना जाता है कि दिव्य तत्व)
  3. 'कम्प्यूटेड' टैब चुनें
  4. यदि कोई पैरामीटर है: वेबकिट-ट्रांसफॉर्म: मैट्रिक्स (...) इसका मतलब है कि तत्व CSS रूपांतरित है, और सेलेनियम 2 द्वारा दृश्य तत्व के रूप में पहचाना नहीं जा सकता है

5

जब समय धीरे-धीरे प्रकट होने वाला होता है, तो अदृश्यता समय के कारण भी हो सकती है। ब्राउज़र को थोड़ा इंतजार करने के लिए मजबूर करने से उस स्थिति में मदद मिल सकती है।

देखें, उदाहरण के लिए, WebDriver को एक तत्व मौजूद होने तक प्रतीक्षा करने पर सवाल ।


2

मुझे इंटरनेट एक्सप्लोरर 9 में सेलेनियम 2 के साथ एक ही समस्या थी, लेकिन मेरा फिक्स वास्तव में अजीब है। मैं अपने फ़ॉर्म के अंदर इनपुट्स में क्लिक नहीं कर पा रहा था -> सेलेनियम दोहराता है, वे दिखाई नहीं दे रहे हैं।

यह उस समय घटित हुआ जब मेरे रूप ने परछाइयों पर अंकुश लगाया था -> http://www.paulund.co.uk/creating-different-css3-box-shadows-effects : कंक्रीट में "प्रभाव सं। 2"

मुझे नहीं पता, क्यों और कैसे इस छद्म तत्व समाधान ने सेलेनियम परीक्षणों को रोक दिया है, लेकिन यह मेरे लिए काम करता है।


2

आप उस एक्सेसिंग / चेंजिंग एलीमेंट को बाध्य नहीं कर सकते हैं जिसमें उपयोगकर्ता के पास सामान्य रूप से एक्सेस नहीं है, क्योंकि सेलेनियम को उपयोगकर्ता इंटरैक्शन की नकल करने के लिए डिज़ाइन किया गया है।

यदि यह त्रुटि होती है, तो जांचें:

  • तत्व आपके व्यूपोर्ट में दिखाई देता है, उस वर्तमान विंडो को अधिकतम करने का प्रयास करें जिसे वेबड्राइवर उपयोग कर रहा है (उदाहरण के लिए maximize()नोड में , maximize_window()पायथन में),
  • आपका तत्व दो बार (एक ही चयनकर्ता के तहत) दिखाई नहीं दे रहा है, और आप गलत का चयन कर रहे हैं,
  • यदि आपका तत्व छिपा हुआ है, तो इसे दृश्यमान बनाने पर विचार करें,
  • यदि आप सीमा के बावजूद छिपे हुए तत्व के मान को बदलना / बदलना चाहते हैं, तो उसके लिए जावास्क्रिप्ट का उपयोग करें (जैसे कि नोडexecuteScript() में ।js , execute_script()पायथन में)।

1
मुझे नहीं पता था कि सेलेनियम इस सख्त होने के लिए डिज़ाइन किया गया है। ऐसा लगता है कि यह वास्तव में एक स्वचालित उपकरण नहीं है जो सामान्य अर्थों में, एक स्वचालित उपयोगकर्ता इंटरैक्शन टूल का अधिक है। मुझे लगता है कि थोड़ा समझ में आता है। स्पष्टीकरण देने के लिए धन्यवाद!
डैनियल लिडस्ट्रॉम

1

मैं इस त्रुटि को हल करते हुए ror परियोजना में capybara का उपयोग करते हुए:

Capybara.ignore_elements = true

को features/support/env.rb


1

मैं बस प्रतीक्षा तत्व प्रदर्शन संपत्ति द्वारा इस त्रुटि को हल करता हूं

waitFor() { element.displayed }

इस पृष्ठ पर सभी उत्तरों में से, यह एक बूटस्ट्रैप मोडल संवाद के साथ मेरा मुद्दा तय किया गया है। धन्यवाद @Suat Keskin!
alastairs

1

मैं बूटस्ट्रैप ग्लिफ़िकॉन के साथ एक django साइट पर कार्यात्मक परीक्षणों के लिए सेलेनियम का उपयोग करके ElementNotVoubleException अपवाद में मिलता है:

<a href="{% url 'item-add' %}"><span class="glyphicon glyphicon-plus text-danger"></span></a>

मेरे कार्यात्मक परीक्षणों के दौरान, बूटस्ट्रैप शैली को लोड नहीं किया जाता है, फिर ऐसे लिंक पर क्लिक करने की कोशिश करने से ElementNotVoubleException उठेगी। मैं उन्हें टैग में स्थान जोड़ने के लिए क्लिक करने योग्य बनाने का प्रबंधन करता हूं , जैसे:

<a href="{% url 'item-add' %}"><span class="glyphicon glyphicon-plus text-danger">&nbsp;</span></a>

1

इस पृष्ठ पर कई अच्छे उत्तर हैं।

  1. मैं आमतौर पर मैक्सिमम.विंडो () के साथ शुरू करता हूं, वास्तव में मैं यह ड्राइवर फैक्ट्री में करता हूं या जहां भी आप अपने ड्राइवर को इनिशियलाइज करते हैं। यह कुछ डिफ़ॉल्ट रूप से किया जाता है - हमेशा।
  2. आमतौर पर कुछ जावास्क्रिप्ट देरी की वजह से तत्व के लिए एक प्रतीक्षा है।

दोनों को ऊपर विभिन्न विवरणों में चर्चा की गई है। मैंने जो उत्तर नहीं देखा था वह था स्क्रॉलऑटलमेंट। ऐसा लगता है कि आप तत्वों की एक सूची तैयार कर रहे हैं, जबकि आप अधिक तत्व, चेकबॉक्स बना रहे हैं। यह आपकी सूची के तत्वों को दृश्य पृष्ठ को बंद करने का कारण बन सकता है। कभी-कभी आप तत्व को नग्न आंखों से देख सकते हैं लेकिन आप उस पर क्लिक नहीं कर सकते। जब प्रसंस्करण सूची आपको कभी-कभी स्क्रॉल करने से रोकना पड़ता है।

  • ब्रेक प्वाइंट सेट करें और देखें कि आप जिस तत्व का उपयोग कर रहे हैं, वह खिड़की के किनारे पर है, ऊपर / नीचे दाएं / बाएं। कभी-कभी जब यह मामला होता है तो आप इसे सेलेनियम के माध्यम से प्राप्त नहीं कर सकते हैं, लेकिन आप अपने माउस से मैन्युअल रूप से क्लिक कर सकते हैं।

क्योंकि मैं इस पार दौड़ता हूं तो मैंने एक PageScroll.java बनाया और अपनी स्क्रॉलिंग स्क्रिप्ट वहां डाल दी। इस वर्ग के कुछ तरीके इस प्रकार हैं:

public static void scrollToTop(WebDriver driver) {
      ((JavascriptExecutor) driver)
        .executeScript("window.scrollTo(0,0)");
    }

    public static void scrollToBottom(WebDriver driver) {
      ((JavascriptExecutor) driver)
        .executeScript("window.scrollTo(0, document.body.scrollHeight)");
    }

    public static void scrollToElementTop(WebDriver driver, WebElement element) {
      ((JavascriptExecutor) driver).executeScript(
        "arguments[0].scrollIntoView(true);", element);
    }

    public static void scrollToElementBottom(WebDriver driver, WebElement element) {
      ((JavascriptExecutor) driver).executeScript(
        "arguments[0].scrollIntoView(false);", element);
    }

देख सेलेनियम के साथ दृश्य में स्क्रॉल तत्व अधिक उदाहरण के लिए


0

स्वीकृत उत्तर ने मेरे लिए काम किया। नीचे कुछ कोड मूल तत्व को खोजने के लिए है जो सेलेनियम को लगता है कि यह दिखाई नहीं दे रहा है।

function getStyles(element){
	
	computedStyle = window.getComputedStyle(element);

	if(computedStyle.opacity === 0
	|| computedStyle.display === "none"
	|| computedStyle.visibility === "hidden"
	|| (computedStyle.height < 0 && computedStyle.height < 0)
	|| element.type === "hidden") {
		console.log("Found an element that Selenium will consider to not be visible")
		console.log(element);
		console.log("opacity: " + computedStyle.opacity);
		console.log("display: " + computedStyle.display);
		console.log("visibility: " + computedStyle.visibility);
		console.log("height: " + computedStyle.height);
		console.log("width: " + computedStyle.width);
	}

	if(element.parentElement){
		getStyles(element.parentElement);
	}
}

getStyles(document.getElementById('REPLACE WITH THE ID OF THE ELEMENT YOU THINK IS VISIBLE BUT SELENIUM CAN NOT FIND'));


0

यहाँ रेत के मेरे दाने को जोड़ने के लिए: यदि कोई तत्व एक निश्चित div के पीछे रहता है, तो इसे माना नहीं जाएगा और आप इसे क्लिक नहीं कर पाएंगे; यह हाल ही में मेरे साथ हुआ और मैंने इसे एक स्क्रिप्ट निष्पादित करते हुए हल किया जैसा कि ऊपर सुझाया गया है, जो यह करता है:

document.evaluate("<xpath locator for element to be clicked>", document, null, XPathResult.ANY_TYPE, null).iterateNext().click()", locator);

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