Domanda

I am using find_index to find an element and then click on its link. However when the index returns nil, it clicks on the link for element 0. Is there a proper way to fail this?

Here is my code:

def index_for(fruit)
   index = fruits_elements.find_index{|f| f.div_element.text == fruit}
   index
end
def click_on_product(fruit)
  index = index_for(fruit)
  fruits_element[index.to_i].link_element.click
end

Ideally I would like it to fail if not found. Currently it clicks on element 0 when nil is returned. As always your help is appreciated.

È stato utile?

Soluzione

Just do change as below

def click_on_product(fruit)
  index = index_for(fruit)
  begin
  # will throw type error, when index is nil.
  fruits_element[index].link_element.click
  rescue TypeError => ex
    # any exception related message if you want to print
    # should be here.
  end
end

However when the index returns nil, it clicks on the link for element 0. Is there a proper way to fail this?

See, you used index.to_i, in the line fruits_element[index.to_i].link_element.click. Now, NilClass#to_i method, actually returning 0. Because nil.to_i is 0. Thus fruits_element[index.to_i] is actually became fruits_element[0], which is the first element, that was getting click as you reported.

As you want to raise error, just don't use to_i method there.

find_index method either returns integer when found, or nil when not found. I think as per your code, there is no need to convert an integer to again integer, as you are interested to throw error.

You should also write the method index_for as below.

def index_for(fruit)
   fruits_elements.find_index {|f| f.div_element.text == fruit }
end

You don't need to write the variable index as a last expression to return it. Because in Ruby, last expression of a method by default returned.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top