capybara ยืนยันคุณสมบัติขององค์ประกอบ


87

ฉันใช้ RSpec2 และ Capybara สำหรับการทดสอบการยอมรับ

ฉันต้องการยืนยันว่าลิงก์ถูกปิดใช้งานหรือไม่อยู่ใน Capybara ฉันจะทำเช่นนี้ได้อย่างไร?

คำตอบ:


91

คุณปิดการใช้งานลิงก์ได้อย่างไร? คุณกำลังเพิ่มชั้นเรียนหรือไม่ แอตทริบิวต์?

# Check for a link that has a "disabled" class:
page.should have_css("a.my_link.disabled")
page.should have_xpath("//a[@class='disabled']")

# Check for a link that has a "disabled" attribute:
page.should have_css("a.my_link[disabled]")
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']")

# Check that the element is visible
find("a.my_link").should be_visible
find(:xpath, "//a[@class='disabled']").should be_visible

ตัวเลือก xpath จริงอาจไม่ถูกต้อง ฉันไม่ได้ใช้ xpath บ่อย!


ขอบคุณ @idlefingers ฉันต้องการยืนยันโดยใช้ xpath ด้วย ฉันจะทำเช่นนั้นได้อย่างไร?
kriysna

ฉันได้อัปเดตคำตอบแล้ว หากตัวเลือก xpath ไม่ถูกต้องคุณจะต้องทำ googling หรือเปิดคำถามใหม่
idlefingers

โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับการทดสอบมุมมองเนื่องจากคาปิบาราไม่ได้ถูกสร้างมาเพื่อใช้กับมุมมอง (Webrat is.)
Peter Ehrlich

145

อีกวิธีง่ายๆคือการเข้าถึงแอตทริบิวต์ HTML ที่คุณกำลังมองหา[]:

find('#my_element')['class']
# => "highlighted clearfix some_other_css_class"

find('a#my_element')['href']
# => "http://example.com

# or in general, find any attribute, even if it does not exist
find('a#my_element')['no_such_attribute']
# => ""

โปรดทราบว่าCapybaraจะพยายามรอให้คำขอแบบอะซิงโครนัสเสร็จสิ้นโดยอัตโนมัติ แต่อาจไม่ได้ผลในบางกรณี:

นี่คือวิธีแก้ปัญหาอย่างหนึ่งหากคุณมีปัญหากับการยืนยันองค์ประกอบที่อัปเดตแบบอะซิงโครนัส:


4
Vrey วิธีแก้ปัญหาที่มีประโยชน์ ขอบคุณ!
Alexander Kuznetsov

ฉันมีสตริงที่มีตำแหน่ง css เช่น find('a#my_element[href]')เป็นไปได้ไหมที่จะดึงค่าของแอตทริบิวต์นี้ ลองใช้สำนวนเหมือนfind('a#my_element[href]').valueแต่ไม่ได้ผล :(
mickael

@mickael ลองfind('a#my_element[href]').textหรือfind('a#my_element[href]').native. แจ้งให้เราทราบหากข้อใดข้อหนึ่งให้ผลลัพธ์ที่คุณคาดหวัง
bowsersenior

1
ฉันตระหนักดีว่าความคิดเห็นเหล่านี้เก่ามาก แต่ใช้วิธีนี้: page.find ('# my_element') ['href = "<href_value>"'] และใช้ได้ผลดี
Dono

การดำเนินการนี้จะไม่รอให้แบบสอบถามเป็นจริงหากคุณต้องการยืนยันเกี่ยวกับการเปลี่ยนแปลงแบบอะซิงโครนัส
sj26

4

มันค่อนข้างยุ่งในการค้นหา xpath ที่ถูกต้องนี่คือสิ่งที่ถูกต้อง
โดยใช้ capybara 0.4.1.1

# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a>  

page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")

หากคุณมีลิงก์ที่ไม่มีคลาสให้ใช้

page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')

สิ่งนี้จะไม่ได้ผลอย่างน่าเศร้า:

page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")

ตัวเลือกคลาสจะถูกละเว้น


4

ฉันขอแนะนำให้ใช้have_linkและfind_link(name)[:disabled]ในสองการยืนยันแยกกัน แม้ว่าการยืนยันครั้งที่สองเพียงอย่างเดียวจะง่ายกว่า แต่ก็ทำให้ข้อความแสดงข้อผิดพลาดเกี่ยวกับลิงก์ที่ขาดหายไปนั้นดูดีขึ้นทำให้อ่านผลการทดสอบได้ง่ายขึ้น

expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false

โปรดทราบว่า"Example"สามารถเปลี่ยนเป็นชื่อหรือรหัสของลิงก์ได้


1
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})

have_link คาดว่าจะมีตัวเลือกที่ว่างเปล่าหากคุณไม่ได้ระบุไว้ คุณสามารถระบุแอตทริบิวต์ใด ๆ ที่ลิงก์ควรมี - ตรวจสอบให้แน่ใจว่าคุณได้ส่งตัวเลือกทั้งหมดในแฮชเดียว

หวังว่านี่จะช่วยได้

PS: สำหรับแอตทริบิวต์เช่น data-method คุณต้องส่งชื่อแอตทริบิวต์เป็นสตริงเนื่องจากยัติภังค์หักสัญลักษณ์


6
ไม่เคยได้ผลและใช้ไม่ได้กับ Capybara ฉันไม่รู้ว่าทำไมคน 9 คนถึงโหวตเรื่องนี้
Andrei Botalov

สิ่งนี้ใช้ไม่ได้ใน Capybara 2 อีกต่อไปผู้ที่ใช้ Capybara <2 สามารถใช้ข้างต้นได้
Tian

@ เทียนมันใช้ไม่ได้ใน Capybara <2. ฉันขอแนะนำให้คุณลงคะแนนคำตอบนี้
Andrei Botalov

class:ไม่ถูกต้อง
Amir Raminfar

1

เมื่อใดก็ตามที่เป็นไปได้คุณควรพยายามใช้กระดาษห่อหุ้มที่ Capybara จัดเตรียมไว้ให้ซึ่งจะทำงานได้อย่างสม่ำเสมอมากขึ้นในไดรเวอร์ต่างๆ

สำหรับกรณีเฉพาะของdisabledWrapper ถูกนำมาใช้ใน 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

หากคุณใช้งานคุณจะได้รับผลลัพธ์ที่สมเหตุสมผลทั้งบน RackTest และ Poltergeist:

HTML:

<input type="text" id="disabled-false"            ></div>
<input type="text" id="disabled-true"     disabled></div>
<input type="text" id="disabled-js-true"          ></div>
<input type="text" id="disabled-js-false" disabled></div>
<script>
  document.getElementById('disabled-js-true').disabled = true
  document.getElementById('disabled-js-false').disabled = false
</script>

การทดสอบ:

!all(:field, 'disabled-false',    disabled: false).empty? or raise
 all(:field, 'disabled-false',    disabled: true ).empty? or raise
 all(:field, 'disabled-true',     disabled: false).empty? or raise
!all(:field, 'disabled-true',     disabled: true ).empty? or raise
 all(:field, 'disabled-js-true',  disabled: true ).empty? or raise
 all(:field, 'disabled-js-false', disabled: false).empty? or raise

Capybara.current_driver = :poltergeist
!all(:field, 'disabled-false',    disabled: false).empty? or raise
 all(:field, 'disabled-false',    disabled: true ).empty? or raise
 all(:field, 'disabled-true',     disabled: false).empty? or raise
!all(:field, 'disabled-true',     disabled: true ).empty? or raise
!all(:field, 'disabled-js-true',  disabled: true ).empty? or raise
!all(:field, 'disabled-js-false', disabled: false).empty? or raise

สังเกตว่าการใช้สิ่งนี้แทนตัวเลือก CSS การทดสอบ Javascript จะทำงานโดยไม่มีการเปลี่ยนแปลงใด ๆ หากคุณเริ่มใช้ไดรเวอร์ที่รองรับ Js

ไฟล์ทดสอบ Runnable ที่นี่


0

bowserseniorขอบคุณสำหรับคำใบ้

อีกวิธีง่ายๆคือการเข้าถึงแอตทริบิวต์ HTML ที่คุณกำลังมองหาด้วย []

นี่คือตัวอย่าง:

let(:action_items) { page.find('div.action_items') }

it "action items displayed as buttons" do
  action_items.all(:css, 'a').each do |ai|
    expect(ai[:class]).to match(/btn/)
  end
end


0

คุณสามารถใช้page.has_css?วิธีการ

page.has_css?('.class_name') 

สิ่งนี้จะกลับมาtrueหากมีองค์ประกอบอยู่

ดำเนินการบางอย่างตามการตรวจสอบความถูกต้อง

page.has_css?('.class_name') do
  #some code
end

0

ตามเอกสารคุณสามารถใช้ไวยากรณ์การเข้าถึง [แอตทริบิวต์]:

find('#selector')['class'] => "form-control text optional disabled"

สำหรับการปิดใช้งานคุณสามารถทำได้:

expect(find('#selector').disabled?).to be(true)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.