File: first_spec.rb

package info (click to toggle)
ruby-capybara 3.40.0%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,368 kB
  • sloc: ruby: 23,988; javascript: 752; makefile: 11
file content (156 lines) | stat: -rw-r--r-- 5,730 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# frozen_string_literal: true

Capybara::SpecHelper.spec '#first' do
  before do
    @session.visit('/with_html')
  end

  it 'should find the first element using the given locator' do
    expect(@session.first('//h1').text).to eq('This is a test')
    expect(@session.first("//input[@id='test_field']").value).to eq('monkey')
  end

  it 'should raise ElementNotFound when nothing was found' do
    expect do
      @session.first('//div[@id="nosuchthing"]')
    end.to raise_error Capybara::ElementNotFound
  end

  it 'should return nil when nothing was found if count options allow no results' do
    expect(@session.first('//div[@id="nosuchthing"]', minimum: 0)).to be_nil
    expect(@session.first('//div[@id="nosuchthing"]', count: 0)).to be_nil
    expect(@session.first('//div[@id="nosuchthing"]', between: (0..3))).to be_nil
  end

  it 'should accept an XPath instance' do
    @session.visit('/form')
    @xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('First Name')
    expect(@xpath).to be_a(XPath::Union)
    expect(@session.first(@xpath).value).to eq('John')
  end

  it 'should raise when unused parameters are passed' do
    expect do
      @session.first(:css, 'h1', 'unused text')
    end.to raise_error ArgumentError, /Unused parameters passed.*unused text/
  end

  context 'with css selectors' do
    it 'should find the first element using the given selector' do
      expect(@session.first(:css, 'h1').text).to eq('This is a test')
      expect(@session.first(:css, "input[id='test_field']").value).to eq('monkey')
    end
  end

  context 'with xpath selectors' do
    it 'should find the first element using the given locator' do
      expect(@session.first(:xpath, '//h1').text).to eq('This is a test')
      expect(@session.first(:xpath, "//input[@id='test_field']").value).to eq('monkey')
    end
  end

  context 'with css as default selector' do
    before { Capybara.default_selector = :css }

    it 'should find the first element using the given locator' do
      expect(@session.first('h1').text).to eq('This is a test')
      expect(@session.first("input[id='test_field']").value).to eq('monkey')
    end
  end

  context 'with visible filter' do
    it 'should only find visible nodes when true' do
      expect do
        @session.first(:css, 'a#invisible', visible: true)
      end.to raise_error Capybara::ElementNotFound
    end

    it 'should find nodes regardless of whether they are invisible when false' do
      expect(@session.first(:css, 'a#invisible', visible: false)).to be_truthy
      expect(@session.first(:css, 'a#invisible', visible: false, text: 'hidden link')).to be_truthy
      expect(@session.first(:css, 'a#visible', visible: false)).to be_truthy
    end

    it 'should find nodes regardless of whether they are invisible when :all' do
      expect(@session.first(:css, 'a#invisible', visible: :all)).to be_truthy
      expect(@session.first(:css, 'a#invisible', visible: :all, text: 'hidden link')).to be_truthy
      expect(@session.first(:css, 'a#visible', visible: :all)).to be_truthy
    end

    it 'should find only hidden nodes when :hidden' do
      expect(@session.first(:css, 'a#invisible', visible: :hidden)).to be_truthy
      expect(@session.first(:css, 'a#invisible', visible: :hidden, text: 'hidden link')).to be_truthy
      expect do
        @session.first(:css, 'a#invisible', visible: :hidden, text: 'not hidden link')
      end.to raise_error Capybara::ElementNotFound
      expect do
        @session.first(:css, 'a#visible', visible: :hidden)
      end.to raise_error Capybara::ElementNotFound
    end

    it 'should find only visible nodes when :visible' do
      expect do
        @session.first(:css, 'a#invisible', visible: :visible)
      end.to raise_error Capybara::ElementNotFound
      expect do
        @session.first(:css, 'a#invisible', visible: :visible, text: 'hidden link')
      end.to raise_error Capybara::ElementNotFound
      expect(@session.first(:css, 'a#visible', visible: :visible)).to be_truthy
    end

    it 'should default to Capybara.ignore_hidden_elements' do
      Capybara.ignore_hidden_elements = true
      expect do
        @session.first(:css, 'a#invisible')
      end.to raise_error Capybara::ElementNotFound
      Capybara.ignore_hidden_elements = false
      expect(@session.first(:css, 'a#invisible')).to be_truthy
      expect(@session.first(:css, 'a')).to be_truthy
    end
  end

  context 'within a scope' do
    before do
      @session.visit('/with_scope')
    end

    it 'should find the first element using the given locator' do
      @session.within(:xpath, "//div[@id='for_bar']") do
        expect(@session.first('.//form')).to be_truthy
      end
    end
  end

  context 'waiting behavior', requires: [:js] do
    before do
      @session.visit('/with_js')
    end

    it 'should not wait if minimum: 0' do
      @session.click_link('clickable')
      Capybara.using_wait_time(3) do
        start_time = Time.now
        expect(@session.first(:css, 'a#has-been-clicked', minimum: 0)).to be_nil
        expect(Time.now - start_time).to be < 3
      end
    end

    it 'should wait for at least one match by default' do
      Capybara.using_wait_time(3) do
        @session.click_link('clickable')
        expect(@session.first(:css, 'a#has-been-clicked')).not_to be_nil
      end
    end

    it 'should raise an error after waiting if no match' do
      @session.click_link('clickable')
      Capybara.using_wait_time(3) do
        start_time = Time.now
        expect do
          @session.first(:css, 'a#not-a-real-link')
        end.to raise_error Capybara::ElementNotFound
        expect(Time.now - start_time).to be > 3
      end
    end
  end
end