Ruby Selenium - 如何在运行时基于属性识别元素

时间:2018-04-17 20:21:17

标签: ruby selenium selenium-webdriver xpath webdriver

我有一个表格,其中有一个名为&#34的列;请求已提交" ,如果提交它已经检查过,否则它不是,我想收集负责检查或未检查的类进行一些测试,这是预期html代码时的两个选项:

//*[@id="main-display"]/div[2]/div[2]/div/table/tbody/tr[3]/td[5]/button/i

<i aria-label="consent received" class="fa fa-check-circle"></i>

AND

//*[@id="main-display"]/div[2]/div[2]/div/table/tbody/tr[4]/td[5]/i


<i aria-label="<span class=&quot;translation_missing&quot; title=&quot;translation missing: en.aria.consent.'not_'received&quot;>'Not 'Received</span>" class="fa fa-circle-thin"></i>

我想在数组中收集"fa-check-circle""fa-circle-thin",这就是我所做的:

Then /^I select request submitted$/ do

req_submitted = $driver.find_elements(:xpath,"//*[@id='main- display']/div[2]/div[2]/div/table/tbody//i")
# consent_values = consents.map { |consent| consent.attribute('class')[3..-1]}
puts req_submitted
ar = []
req_s = req_submitted.map do |r|
case r.attribute('class')
when "fa fa-check-circle" then ar.push('fa-check-circle')
when "fa fa-circle-thin" then ar.push('fa-circle-thin')
else nil
  end   
 end
end

谢谢,

2 个答案:

答案 0 :(得分:1)

此代码将提供您的预期结果

array=[driver.find_elements(xpath: "//i[@class='fa fa-check-circle']"), driver.find_elements(xpath: "//i[@class='fa fa-circle-thin']")]
    .flatten
    .map{|element|element.attribute('class').split.last}

p array

更新

正如您所问,下面的代码打印true如果所有元素都相同

result=(array.uniq.count.eql? (1)) ? true : false

p result

如果您想特别检查fa-check-circle,请编写以下代码

p array.map{|x|x.eql?'fa-check-circle'}.all?

#=> true if all elements are 'fa-check-circle' otherwise false

答案 1 :(得分:1)

根据您的问题,您似乎希望使用 class 属性收集元素作为 fa fa-check-circle class 属性如 fa fa-circle-thin 。因此,您可以按如下方式优化定位器策略

find_element()

注意:正如您所说,您想在数组中收集“fa-check-circle”和“fa-circle-thin”,粗略的 fa-check-circle fa-circle-thin 在任何情况下都不会同时出现,您可以使用{{1}}代替。