বর্তমানে দৃশ্যমান নয় এমন উপাদানটিতে ক্লিক করতে সেলেনিয়াম ওয়েবড্রাইভারকে কীভাবে বাধ্য করবেন?


99

আমি ফায়ারফক্সড্রাইভারের সাথে সেলেনিয়াম 2 জাভা এপিআই ব্যবহার করছি। আমি যখন কোনও ফর্ম পূরণ করি, তখন ফর্ম ইনপুট অনুসারে চেকবক্সগুলি পৃষ্ঠায় যুক্ত করা হবে।

আমি সেলেনিয়াম ব্যবহার করে সেই চেকবক্সগুলিতে ক্লিক করতে চাই। নিয়মিত ব্রাউজারে উপাদানটি দৃশ্যমান এবং ব্যবহারযোগ্য হয় তবে, সেলেনিয়াম জোর দেয় যে উপাদানগুলি দৃশ্যমান নয়।

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

আমি কি সেলেনিয়ামকে উপাদানগুলির অ-দৃশ্যমান অবস্থা উপেক্ষা করতে বাধ্য করতে পারি? আমি কীভাবে সেলেনিয়ামকে অ-দৃশ্যমান উপাদানটির সাথে যোগাযোগ করতে বাধ্য করতে পারি?


আপনি কোন ব্রাউজার ব্যবহার করছেন? অক্ষম হওয়া বা দৃশ্যমান নয় এমন উপাদানগুলির সাথে আপনি আলাপচারিতা করতে পারবেন না কারণ শেষ ব্যবহারকারী তাদের সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হবে না। আপনি যদি আমার চেষ্টা করে সমস্যাটি নির্ণয় করতে চান তবে আপনাকে নিজের পরীক্ষার কোড এবং পৃষ্ঠা উত্স সরবরাহ করতে হবে।
আর্দেসকো

উত্তর:


102

সেলেনিয়ামটি নির্ধারণ করে যে কোনও উপাদানটি দৃশ্যমান কিনা তা নিম্নলিখিত মানদণ্ড অনুসারে নয় (কোনও ডিএসএম পরিদর্শককে আপনার উপাদানটিতে কী প্রযোজ্য তা নির্ধারণ করতে ব্যবহার করুন, নিশ্চিত করুন যে আপনি গণিত শৈলীর দিকে নজর রেখেছেন):

  • দৃশ্যমানতা! = লুকানো
  • প্রদর্শন! = কিছুই নয় (প্রতিটি প্যারেন্ট উপাদানগুলির বিরুদ্ধেও পরীক্ষা করা হয়)
  • অস্বচ্ছতা! = 0 (এটি কোনও উপাদান ক্লিক করার জন্য পরীক্ষা করা হয় না)
  • উচ্চতা এবং প্রস্থ উভয়ই 0 0
  • একটি ইনপুট জন্য, বৈশিষ্ট্য টাইপ! = লুকানো

আপনার উপাদানটি সেই মানদণ্ডগুলির মধ্যে একটির সাথে মেলে। যদি আপনার উপাদানটির স্টাইলিং পরিবর্তন করার ক্ষমতা না থাকে তবে আপনি এখানে জাভাস্ক্রিপ্ট দিয়ে জোর করে কীভাবে করতে পারবেন (ওয়েবড্রাইভার ধরে নিতে চলেছেন যেহেতু আপনি সেলেনিয়াম 2 এপিআই বলেছেন):

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

তবে এটি কোনও জাভাস্ক্রিপ্ট ইভেন্টটিকে আগুন ধরিয়ে দেবে না, যদি আপনি সেই ইনপুটটির পরিবর্তনের ইভেন্টের উপর নির্ভর করেন তবে আপনাকে এটিকেও বহিস্কার করতে হবে (এটি করার অনেক উপায়, জাভাস্ক্রিপ্ট লাইব্রেরি যে পৃষ্ঠাটিতে লোড করা আছে তা ব্যবহার করা সবচেয়ে সহজ)।

দৃশ্যমানতা যাচাইয়ের জন্য উত্স -

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

ওয়েবড্রাইভার স্পেস যা এটি সংজ্ঞায়িত করে -

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


4
শর্তগুলির তালিকার জন্য আপনার কাছে কোনও উত্স (বা ক্যানোনিকাল লিঙ্ক) আছে?
এমজেজেস

4
যতক্ষণ আপনি জাভাস্ক্রিপ্টটি পড়তে পারবেন, পদ্ধতি bot.dom.isSown হ'ল দৃশ্যমানতাটি কী তা নির্ধারণ করে: Code.google.com/p/selenium/source/browse/trunk/javascript/atoms/…
লুকিয়াস

এখানে ইনপুটমেন্ট কী। আমি নীচের কোডটি ওয়েবএলমেন্ট ইনপুটমেন্ট = ড্রাইভার.ফাইন্ডইলেট (বাই.স্পাথ (PASSWORD_PATH)) চালাচ্ছি; ((জাভাস্ক্রিপ্টএক্সিকিউটর) ড্রাইভার)। এক্সেকিউটস্ক্রিপ্ট ("আর্গুমেন্ট [0]। চেক করা হয়েছে = সত্য;", ইনপুট উপাদান); তবে কোনও সহায়তা ইনপুটলমেন্ট.সেন্ডকি (পাসওয়ার্ড) নেই;
দীপক গোয়েল

4
@ নীলেশর্মা পাইথনের পদ্ধতিটি সরাসরি চালকের অবজেক্টে এক্সিকিউট_স্ক্রিপ্ট রয়েছে: ড্রাইভার.execute_script (...)
লুকাইস

4
@ টুনাবাম পোস্ট করা উত্সের লিঙ্কটি কোড জিও
পি /

27

কখনও কখনও এর অর্থ এমন একটি পৃষ্ঠায় একাধিক উপাদান রয়েছে যার সমান সম্পত্তি আপনি অনুসন্ধান করার চেষ্টা করছেন এবং আপনি "ভুলের সাথে কথা বলছেন"।

যদি আপনার উপাদানটি অনন্যভাবে সনাক্ত করতে না পারে: আইডি বা: নাম (বা: শ্রেণি), তবে এটি জটিল y

কখনও কখনও দ্বারা উপাদানগুলির সন্ধান করা: এক্সপাথ সাহায্য করবে এবং কিছু ক্ষেত্রে এটি ব্যবহারিকও নয়।

এই ক্ষেত্রে, আপনাকে সমস্ত মানদণ্ডগুলি পেতে হতে পারে যা আপনার মানদণ্ডের সাথে মেলে এবং সূচক দ্বারা সঠিকটিকে রেফারেন্স করতে পারে। এটি নোংরা, কিন্তু এটি কাজ করে।

আমি রেল অ্যাপ্লিকেশনগুলিতে রুবি থেকে সেলেনিয়াম / ওয়াটার ব্যবহার করছি, সুতরাং আমার ক্ষেত্রে উদাহরণটি হ'ল:

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

আশাকরি এটা সাহায্য করবে.


ডোম উপাদানটিতে একটি আইডি যুক্ত করা এটি আমার জন্য স্থির করে
নওরো

আমার একই সমস্যা ছিল এবং এক্সপথটি সামঞ্জস্য করা যাতে এটি কোনও অনন্য উপাদানটির কৌশলটি করতে পারত could
জন

আমারও একই সমস্যা ছিল। ম্যাচগুলি গণনা করার জন্য ফাইন্ডএল্টিম () -এর কল পরিবর্তিত হয়েছে এবং এর সাথে আরও একটি মিলের উপাদান রয়েছে। ধন্যবাদ!
মেষ

এটা আমার জন্য অনেক। আপনি যে উপাদানটির সাথে মতবিনিময় করছেন বলে মনে করেন আপনার নির্বাচনের মানদণ্ডটি যথেষ্ট পরিমাণে সুনির্দিষ্ট make অনেক বার খেলতে গিয়ে আমি দুটি উপাদান পেয়েছি এবং একটি লুকিয়ে রয়েছে এবং আমাকে এই ত্রুটি দেয়।
ক্রিস

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

আরও একটি ক্ষেত্রে রয়েছে যখন দৃশ্যমান উপাদানটি দৃশ্যমান নয় হিসাবে স্বীকৃত হবে:

  • যখন এলিমেন্ট সিএসএস রূপান্তরিত হয়
  • যখন এলিমেন্টের মূল উপাদানটি সিএসএস রূপান্তরিত হয়

আপনি যে উপাদানটির সাথে ইন্টারঅ্যাক্ট করতে চান না তা সিএসএস রূপান্তরিত কিনা, ক্রোম এ এটি করুন:

  1. ওপেন ইন্সপেক্টর
  2. আকর্ষণীয় উপাদান (বা সম্ভবত এটির মূল উপাদান, সম্ভবত ডিভ উপাদান) সন্ধান করুন
  3. 'গণিত' ট্যাবটি নির্বাচন করুন
  4. যদি কোনও প্যারামিটার থাকে: ওয়েবকিট-ট্রান্সফর্ম: ম্যাট্রিক্স (...) এর অর্থ হ'ল উপাদানটি সিএসএস রূপান্তরিত, এবং সেলেনিয়াম 2 দ্বারা দৃশ্যমান উপাদান হিসাবে স্বীকৃত নাও হতে পারে

5

উপাদানটি আস্তে আস্তে উপস্থিত হওয়ার কথা যখন সময় হয় তখন অদৃশ্যতাও হতে পারে। ব্রাউজারকে কিছুটা অপেক্ষা করতে বাধ্য করা সে ক্ষেত্রে সহায়তা করতে পারে।

দেখুন, উদাহরণস্বরূপ, ওয়েবড্রাইভারকে কোনও উপাদান উপস্থিত না হওয়া পর্যন্ত অপেক্ষা করতে দেওয়ার বিষয়ে প্রশ্ন ।


2

ইন্টারনেট এক্সপ্লোরার 9 এ আমার সেলেনিয়াম 2 এর সাথে একই সমস্যা ছিল তবে আমার ফিক্সটি সত্যিই অদ্ভুত। আমি আমার ফর্ম -> সেলেনিয়াম পুনরাবৃত্তিগুলির ভিতরে ইনপুটগুলিতে ক্লিক করতে সক্ষম হইনি, সেগুলি দৃশ্যমান নয়।

এটি ঘটেছিল যখন আমার ফর্মটি বক্ররেখার বক্ররেখা ছিল -> http://www.paulund.co.uk/creating-differences-css3-box-sadows-efeferences : কংক্রিটের "প্রভাব নং 2" তে

আমার কী ধারণা নেই, কেন এবং কীভাবে এই সিউডো উপাদান সমাধানটি সেলেনিয়াম পরীক্ষা বন্ধ করে দিয়েছে, তবে এটি আমার পক্ষে কার্যকর।


2

সেলেনিয়াম ব্যবহারকারীর মিথস্ক্রিয়া অনুকরণ করার জন্য নকশা করা হয়েছে বলে আপনি সাধারণত এমন উপাদান অ্যাক্সেস / পরিবর্তন করতে পারবেন না যেখানে ব্যবহারকারী সাধারণত অ্যাক্সেস পায় না।

যদি এই ত্রুটিটি ঘটে থাকে তবে তা পরীক্ষা করে দেখুন:

  • উপাদানটি আপনার ভিউপোর্টে দৃশ্যমান, ওয়েবড্রাইভার যে বর্তমান উইন্ডোটি ব্যবহার করছে তা সর্বাধিক করার চেষ্টা করুন (উদাহরণস্বরূপ maximize(), নোড.জেএসএসে , maximize_window()পাইথনে),
  • আপনার উপাদানটি দু'বার প্রদর্শিত হচ্ছে না (একই নির্বাচকের অধীনে) এবং আপনি ভুলটি নির্বাচন করছেন,
  • যদি আপনার উপাদানটি গোপন থাকে তবে এটিকে দৃশ্যমান করার বিষয়ে বিবেচনা করুন,
  • যদি আপনি সীমাবদ্ধতা সত্ত্বেও গোপন উপাদান এক্সেস / পরিবর্তন মান চাই, তাহলে সেই জন্য জাভাস্ক্রিপ্ট (যেমন ব্যবহার executeScript()মধ্যে Node.js , execute_script()পাইথন মধ্যে)।

4
আমার ধারণা ছিল না সেলেনিয়াম এই কঠোর হতে ডিজাইন করা হয়েছে। দেখে মনে হচ্ছে এটি সাধারণ অর্থে আসলে একটি অটোমেশন সরঞ্জাম নয়, আরও বেশি একটি স্বয়ংক্রিয় ব্যবহারকারী ইন্টারঅ্যাকশন সরঞ্জাম। আমি অনুমান করি কিছুটা বোধ করি। স্পষ্ট করার জন্য ধন্যবাদ!
ড্যানিয়েল লিডস্ট্রোম

1

রর প্রকল্পে ক্যাপিবারা ব্যবহার করার সময় আমি কেবল এই ত্রুটিটি সমাধান করেছি:

Capybara.ignore_elements = true

to features/support/env.rb


1

আমি কেবলমাত্র ত্রুটিযুক্ত উপাদান প্রদর্শন সম্পত্তি দ্বারা এই ত্রুটিটি সমাধান করি

waitFor() { element.displayed }

এই পৃষ্ঠার সমস্ত উত্তরগুলির মধ্যে, এটি আমার বুটস্ট্র্যাপ মডেল ডায়ালগটি দিয়ে আমার সমস্যাটিকে স্থির করেছে। ধন্যবাদ @ স্যুট কেসকিন!
এস্টেয়ারস

1

আমি টেমপ্লেটগুলির লিঙ্ক হিসাবে বুটস্ট্র্যাপ গ্লাইফিকন সহ একটি জ্যাঙ্গো সাইটে ফাংশনাল পরীক্ষার জন্য সেলেনিয়াম ব্যবহার করে এলিমেন্টনটভিজিবলএক্সেপশন ব্যতিক্রমতে যাচ্ছি:

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

আমার কার্যকরী পরীক্ষার সময়, বুটস্ট্র্যাপ স্টাইলটি লোড হয় না, তারপরে এই জাতীয় লিঙ্কগুলিতে ক্লিক করার চেষ্টা করলে এলিমেন্টনটভিজিবল এক্সেপশন বাড়বে। আমি এগুলিকে ট্যাগ করার জন্য কেবল একটি জায়গাগুলি যুক্ত করে তুলতে সক্ষম করে তুলেছি :

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

1

এই পৃষ্ঠায় অনেক ভাল উত্তর আছে।

  1. আমি সাধারণত ম্যাক্সিমাইজ.উইন্ডো () দিয়ে শুরু করি, আসলে আমি এটি ড্রাইভার ফ্যাক্টরিতে বা যেখানেই আপনি আপনার ড্রাইভারকে আরম্ভ করেন। এটি সর্বদা ডিফল্টরূপে করা।
  2. এটি কিছু জাভাস্ক্রিপ্টের বিলম্বের কারণে সাধারণত উপাদানটির জন্য অপেক্ষা করে।

উভয়ই উপরোক্ত বিভিন্ন বিবরণে আলোচনা করা হয়। যে উত্তরটি আমি দেখিনি তা হ'ল স্ক্রোলটোলেট lement মনে হচ্ছে আপনি উপাদানগুলির একটি তালিকা প্রক্রিয়া করছেন, প্রক্রিয়া করার সময় আপনি আরও উপাদান তৈরি করছেন, চেকবক্স। এটি আপনার তালিকার উপাদানগুলিকে দৃশ্যমান পৃষ্ঠাটি সরিয়ে ফেলতে পারে। কখনও কখনও আপনি খালি চোখে উপাদানটি দেখতে পাবেন তবে আপনি কেবল এটিতে ক্লিক করতে পারবেন না। তালিকাগুলি প্রক্রিয়া করার সময় আপনাকে মাঝে মাঝে স্ক্রোলিং ইন্টারেক্ট করতে হয়।

  • একটি বিরতি বিন্দু সেট করুন এবং আপনি যে উপাদানটি ব্যবহার করছেন এটি উইন্ডো প্রান্তে, উপরে / নীচে ডান / বামে রয়েছে কিনা তা পরীক্ষা করে দেখুন। কখনও কখনও যখন এটি হয় আপনি সেলেনিয়ামের মাধ্যমে এটি পেতে পারবেন না তবে আপনি নিজের মাউস দিয়ে ম্যানুয়ালি ক্লিক করতে পারেন।

কারণ আমি এটি পেরিয়ে চলেছি আমি একটি পৃষ্ঠাস্ক্রোল.জভা তৈরি করেছি এবং আমার স্ক্রোলিং স্ক্রিপ্টগুলি সেখানে রেখেছি। এই শ্রেণি থেকে কয়েকটি পদ্ধতি এখানে রইল:

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

আমার বালির শস্য এখানে যুক্ত করতে: যদি কোনও উপাদান একটি নির্দিষ্ট ডিভের পিছনে থাকে তবে এটি দৃশ্যমান নয় বলে বিবেচিত হবে এবং আপনি এটিতে ক্লিক করতে পারবেন না; এটি আমার সাথে সম্প্রতি ঘটেছিল এবং আমি এটি উপরে বর্ণিত হিসাবে একটি স্ক্রিপ্ট কার্যকর করে সমাধান করেছি, যা এটি করে:

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

এখানে লোকেটার কি?
অঞ্জনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.