使用红宝石和硒找到所有元素的总和

时间:2017-07-02 19:52:41

标签: ruby-on-rails ruby selenium

在我的网页中,文本字段中给出了5个值(例如$ 10,$ 20,$ 30,$ 40和$ 50),我试图使用ruby和selenium WebDriver对值进行求和。

这是我的代码:

C383CB9CC382C2A7C383E284A2C3A2E282ACC5BEC383CB9CC382C2B1C383E284A2C385C2A0C383CB9CC382C2A7C383CB9CC382C2B6

我希望看到输出为150.我是否需要将值存储在数组中?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

很难准确地说出你想要做什么,但这可能会有所帮助。我假设你有一个带有美元符号的字符串值数组:

>> allelements = ["$10", "$20", "$30", "$40", "$50"]
=> ["$10", "$20", "$30", "$40", "$50"]

我们可以创建一个新数组来剥离所有非数字字符并将字符串值转换为整数:

>> integers = allelements.map { |e| e.gsub(/[^\d]/, '').to_i }
=> [10, 20, 30, 40, 50]

现在使用inject对值进行求和:

>> integers.inject(:+)
=> 150

答案 1 :(得分:0)

您应该在代码中修改一些内容以使其正常工作:

  1. 修正参数传递给find_elements的方式;它应该是id: "lbl_val_"

  2. find_elements会返回WebDriver::Element个对象的数组,因此您必须检查每个对象的value

  3. 字符串"Searching element #{value1, value2, value3, value4, value5}"无效,因为您尝试插入用逗号链接的5个变量的值。您需要仅对变量进行interplate(将逗号保持为字符串)或使用方括号([])来插入数组。

  4. 现在你的代码看起来像这样 1

    def get_sum_of_all_elements
      @logger.info("Searching element #{[value1, value2, value3, value4, value5]}")
      allelements = @driver.find_elements(id: "lbl_val_")
      @logger.info("Total Elements Found with locator #{locator} are : #{allelements.size}");
    
      if allelements.all? { |elem| elem.value.start_with?("$") }
        elements = allelements.map { |elem| elem.value.tr('$', '').to_i }
        elements.reduce(:+)
      end
    end
    

    有几点需要注意:

    • 在方法定义中删除了括号(()),当没有传递参数时,ruby不需要它们。
    • 不再需要将最终值分配给变量(例如iSum),因为ruby将返回上次评估代码的结果。
    • 如果任何值未以"$"开头,则会返回false。您可以通过在if阻止后添加默认值来更改此项。
    • 分号(;)被删除了,你不需要它们用红宝石(除非你想在单行中链接多个语句)。

    另外一件事,变量value1value2value3value4value5locator似乎不是设置方法中的任何位置;你必须在你的方法中设置它们(或将它们作为参数传递),否则你将收到错误。

    1 这考虑了您在代码中寻找的逻辑,即只有当所有值都以"$"开头时才对所有值求和。< / em>的