ক্যাপিবারাতে প্যারেন্ট নোড কীভাবে পাবেন?


86

আমি অনেক jQuery প্লাগইন নিয়ে কাজ করছি, যা প্রায়শই আইডি বা অন্যান্য সনাক্তকরণের বৈশিষ্ট্য ছাড়াই ডোম উপাদান তৈরি করে এবং ক্যাপাইবারায় এটি পাওয়ার একমাত্র উপায় (উদাহরণস্বরূপ ক্লিক করার জন্য) - তাদের প্রতিবেশী (তার পূর্বপুরুষের অন্য একটি শিশু) প্রথমে পাওয়া is । তবে আমি কোথাও খুঁজে পাইনি, ক্যাপিবারা কি এই জাতীয় জিনিসগুলিকে সমর্থন করে:

find('#some_button').parent.fill_in "Name:", :with => name

?


এছাড়াও এটি আমার পক্ষে খুব কার্যকর হবে, যদি আপনি বলেন, ক্যাপিবারা কি {ডিসপ্লে: লুকানো with সহ উপাদানগুলিতে ক্লিক তৈরি করে এবং কিছু সুযোগে উপাদানগুলি খুঁজে পাওয়ার কোনও উপায় আছে, যেখানে প্রদর্শন! = গোপন?
স্যান্ড্রু

এটি একটি পৃথক প্রশ্ন, তবে এটি আপনি যে ড্রাইভারটি ব্যবহার করছেন তার উপর নির্ভর করে। ওয়েবরেট গোপন জিনিসগুলি সুখে খুঁজে পাবেন, তবে সেলেনিয়াম আপনি দেখতে পাচ্ছেন না এমন আইটেমগুলিতে ক্লিক করতে ততটা খুশি নয়।
জামুরাআ

উত্তর:


111

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

find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name

ক্যাপিবারা ২.০ আপডেট : find(:xpath,".//..")সম্ভবত একটি Ambiguous matchত্রুটি ঘটবে । সেক্ষেত্রে first(:xpath,".//..")পরিবর্তে ব্যবহার করুন।


এই ধারণার জন্য ধন্যবাদ - আমি কখনই এটি ভাবিনি! আমি খুঁজে পাওয়া (: সিএসএস) সাথে পাওয়া একটি টিডি উপাদানটির জন্য এল.প্যারেন্টটি করছিলাম, তবে কোনও কারণে আমি বুঝতে পারি না, এল.প্যারেন্ট # <ক্যাপিবারা :: ডকুমেন্ট> এ ফিরে আসছিলেন। el.find (: xpath, ".// ..") অন্যদিকে ফিরে আসে # <ক্যাপিবারা :: এলিমেন্ট ট্যাগ = "ত্রি">, যা আমার প্রয়োজন।
টাইলার রিক

নির্দিষ্ট প্যারেন্ট নোডের পুনরাবৃত্তভাবে সন্ধান করার আর একটি উপায় হ'ল এক্সপথের পূর্বপুরুষ বা স্ব-নির্বাচক। এটি পরীক্ষা করে দেখুন stackoverflow.com/questions/1362466/...
vrish88

25
আপনার .//..পিতামাতাকে খুঁজে পাওয়ার দরকার নেই - কেবল ..পর্যাপ্ত পরিমাণে, এবং এটি কখনই অস্পষ্ট নয়।
ইমন নেরবোন

ty! আমি জানি এই মন্তব্যটি দলের পক্ষে কিছুটা দেরি হয়েছে, তবে আমি সম্পাদনাটি পড়ার পরে এবং নীচের দিকে এটি কমিয়ে দিয়েছি এবং ইমনর মন্তব্য: এল.ফার্স্ট (: এক্সপথ, '..')
অ্যাসচিয়েল

39

ক্যাপিবারা এবং সিএসএস দিয়ে এটি করার কোনও উপায় নেই। আমি এই লক্ষ্যটি অর্জনে অতীতে এক্সপ্যাথটি ব্যবহার করেছি, যার মূল উপাদানটি পাওয়ার একটি উপায় রয়েছে এবং এটি ক্যাপাইবারার দ্বারা সমর্থিত:

find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name

4
আমি যখন অনুরূপ এক্সপথটি সন্ধান করি, তখন আমি একটি নোকোগিরি ত্রুটি পেয়েছি যা এক্সপ্রেশনটি অবৈধ। আমি এক্সপ্রেশনটিতে খোলা স্কোয়ার ব্র্যাকেটের একটি নক্ষত্রের সম্মুখভাগ যুক্ত করেছি:find(:xpath, '//*[@id="some_button"]/..')
অ্যান্ড্রু ফার্ক

35

আমি নিম্নলিখিতটি যে কাজ করে তা পেয়েছি:

find(:xpath, '..')

এটি সমর্থন করার জন্য ক্যাপিবারা আপডেট করা হয়েছে।

https://github.com/jnicklas/capybara/pull/505


4
আমার কাছে মনে হচ্ছে আপনি এখানে পূর্ববর্তী উত্তরটি সাড়া / সম্পূর্ণ করছেন ("এটি" যা "কাজ করছিল না"?)। এটি একটি সম্পূর্ণ এবং স্বতন্ত্র উত্তর হলে এটি আরও ভাল। সুতরাং আমি আপনাকে এটি সম্পাদনা করার পরামর্শ দিচ্ছি। ;-)
হেলেনভ

নিশ্চিত করতে পারেন. সর্বশেষ ক্যাপিবারা ২.১৪.৪ সহ, প্যারেন্ট নোড পাওয়ার উপযুক্ত উপায় এটি।
fny

10

আপনি যদি কোনও পিতামাতাকে ( পূর্বপুরুষের মতো ) নোড (কীভাবে @ প্যাসিকাল লিন্ডলাউফের উত্তর সম্পর্কে @ ভিরিশ ৮৮ এর মন্তব্যে ইঙ্গিত করেছেন) কীভাবে খুঁজে পাবেন তা বোঝার চেষ্টা করে যদি এই হোঁচট খেয়ে পড়ে থাকেন:

find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')

5

এই উত্তরটি কীভাবে কোনও সহোদর উপাদানকে পরিচালনা করতে পারে যা আমি বিশ্বাস করি যে মূল প্রশ্নটি ইঙ্গিত করছে

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

<div>
  <input></input>
  <button>Test</button>
</div>

আপনার জিজ্ঞাসাটি তখন হবে:

find('button', text: 'Test').find(:xpath, "..").find('input').set('whatever')

যদি গতিশীলভাবে উত্পন্ন ইনপুটটি কোনও আইডি উপাদানটির সাথে সংযুক্ত হয় (এগুলি সম্পর্কে কৌতুকের মতো সতর্ক থাকুন তবে তারা উপাদানগুলি যুক্ত এবং মুছার উপর ভিত্তি করে পরিবর্তন করতে পারবেন না) এটি এমন কিছু হবে:

find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')

আশা করি এইটি কাজ করবে.


4

আমি প্রথমে এই প্যারেন্ট উপাদানটির মধ্যে টেক্সটটি ব্যবহার করে প্যারেন্ট উপাদানটি সন্ধান করে একটি পৃথক পদ্ধতি ব্যবহার করছি:

find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name

সম্ভবত এটি একটি অচেনা পরিস্থিতিতে কার্যকর in


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

2

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

def find_ancestor_with_class(field, cssClass)
  ancestor = field
  loop do
    ancestor = ancestor.find(:xpath, '..')
    break if ancestor.nil?

    break if ancestor.has_css? cssClass
  end

  ancestor
end

সতর্কতা: এটিকে অল্প পরিমাণে ব্যবহার করুন, পরীক্ষায় এটি আপনাকে অনেক সময় দিতে পারে যাতে পূর্বপুরুষটি কয়েক কিলোমিটার দূরে রয়েছেন তা নিশ্চিত করুন।


স্পিডআপ: এর সাথে আপনার দ্বিতীয় বিরতি প্রতিস্থাপন করুন break if ancestor[:class].split(" ").include?(css_class)
হাকুনিন

@ হাকুনিন আমি কৌতূহল করছি আপনি কতটা স্পিডআপ দেখছেন? তাৎপর্যপূর্ণ?
ক্রস

এখন পরীক্ষা করা যায় না, তবে has_css ক্লাসটির সাথে মিল রেখে তত্ক্ষণাত্ মনে হয়েছিল বলে একটি সেকেন্ড নিয়েছে।
হাকুনিন

ক্যাপিবারাতে এখন একটি ancestor(selector)পদ্ধতি অন্তর্নির্মিত রয়েছে See দেখুন Github.com/teamcapybara/capybara/commit/...
টিলার রিক

-5

এটা এখানে

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base: বাবা

এখানে একটি প্যারেন্ট পদ্ধতি উপস্থিত রয়েছে;)


4
এটি কেবলমাত্র আমার জন্য শীর্ষ-স্তরের নথি ফেরত দেয়। এটি কোনও ড্রাইভারের সমস্যা বা কী তা নিশ্চিত নয়।
নেরডমাস্টার

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