ক্যাপাইবার 2.0 তে আপগ্রেড করার পরে আইটেমের তালিকার প্রথম লিঙ্কটি কীভাবে ক্লিক করবেন?


125

এই ক্ষেত্রে প্রথম লিঙ্কটি কীভাবে ক্লিক করবেন:

<div class="item">
  <a href="/agree/">Agree</a>
</div>
<div class="item">
  <a href="/agree/">Agree</a>
</div>
within ".item" do
  first(:link, "Agree").click
end

এবং আমি এই ত্রুটি পেয়েছি:

Capybara::Ambiguous:
  Ambiguous match, found 2 elements matching css ".item"

এবং withinআমি ছাড়া এই ত্রুটিটি পাই:

Failure/Error: first(:link, "Agree").click
NoMethodError:
  undefined method `click' for nil:NilClass

উত্তর:


176

আপনি কেবল ব্যবহার করতে পারেন:

first('.item').click_link('Agree')

অথবা

first('.item > a').click

(যদি আপনার ডিফল্ট নির্বাচক হয়: সিএসএস)


আপনার প্রশ্নের কোড এর মতো কাজ করে না:

within ".item" do
  first(:link, "Agree").click
end

সমান:

find('.item').first(:link, "Agree").click

ক্যাপিবারা বেশ কয়েকটি সন্ধান করে .itemতাই এটি একটি ব্যতিক্রম উত্থাপন করে। আমি ক্যাপাইবার 2 এর এই আচরণটি খুব ভাল বিবেচনা করি।


4
আমি # ফার্স্ট ব্যবহারের বিরুদ্ধে সুপারিশ করব, এটি কোনও উপাদান থাকার জন্য অপেক্ষা করে না: রুবডোক.ইন.ফো / গিথুব / জনিকলাস / ক্যাপাইবার / । লিখিততা তৈরির আগে প্রত্যাশাটি চালিত হলে জেএসের সাথে রানটাইমতে সামগ্রীটি তৈরি করা থাকলে প্রথমে শূন্যতা ফিরে আসবে।
অগস্ট

122

নিম্নলিখিত চেষ্টা করুন:

within ".item" do
  click_link("Agree", :match => :first)
end

সূত্র:


1
আশ্চর্যজনক। এবং এটা সহজ page.find উপর কাজ করে ( '# {CSS}': ম্যাচ =>: প্রথম) সত্যিই সহায়ক উত্তরের জন্য .click চিয়ার্স
Dono


4

এক্সপথ উপাদানটিকে সম্বোধন করতে পারে। আমি এটির সাথে এখনও খুব ভাল না, তবে এরকম কিছু//div[@class='active'][1]/a

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

আমার প্রকল্পগুলির একটির কার্যকরী উদাহরণ:

পেজ.ফাইন্ডের মধ্যে ("ডিভ.প্যানেল", পাঠ্য: / প্রস্তাবসমূহ /) করুন
  পেজ.ফাইন্ডের মধ্যে ('টিআর', পাঠ্য: / ফু /) করুন
    পেজ.শব্দটি থাকতে হবে ('টিডি [3]', পাঠ্য: @ আজ)
  শেষ
শেষ

2

যেহেতু প্রথম () সর্বদা অপেক্ষা করে না, সম্ভবত এটি দরকারী:

expect(page).to have_css("selector")                               
first("selector").click

2

এই সমাধানগুলির বেশিরভাগটি ক্যাপিবার উজ্জ্বল অপেক্ষার বৈশিষ্ট্যগুলি ব্যবহার করবে না

এই লিঙ্কটি যেমন পরামর্শ দেয় তেমনি আরও ভাল করুন:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

খারাপ:

first(".active").click
যদি পৃষ্ঠাটিতে এখনও কোনও কার্যকর উপাদান না থাকে তবে প্রথমে শূন্যতা ফিরে আসবে এবং ক্লিকটি ব্যর্থ হবে।

ভাল:

আপনি যদি নিশ্চিত করতে চান তবে ঠিক আছে
find(".active").click

আপনি যদি কেবল প্রথম উপাদানটি চান তবে
find(".active", match: :first).click
ক্যাপিবারা ক্লিক করার চেষ্টা করার আগে উপাদানটি উপস্থিত হওয়ার জন্য অপেক্ষা করবে।

নোটটি match: :firstআরও ভঙ্গুর, কারণ যদি আপনি মেলে এমন নতুন উপাদানগুলি প্রবর্তন করেন তবে এটি নিঃশব্দে একটি আলাদা উপাদানটিতে ক্লিক করবে।


আমি বিশ্বাস করি এটিই সবচেয়ে সঠিক উত্তর।
কাটারিকটা

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