Есть ли способ сократить текст значения переменной в условных выражениях или вообще в ruby? - PullRequest
1 голос
/ 14 июля 2020

Я новичок в Ruby, и я создаю парсер. У меня есть переменная, которой присваивается значение, если условие истинно.

Проблема в том, что значение переменной действительно длинное, и я бы не хотел повторяться с этими длинными значениями.

Я использую условные выражения, потому что количество существующих данных не является статическим c числом.

    #Grab the top 3 comps if they exist
        #comp1
    if b.element(:xpath => '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table/tbody/tr[1]/td[13]/span').exists?
        comp1 = b.element(:xpath => '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table/tbody/tr[1]/td[13]/span')
    end
        #comp2
    if b.element(:xpath => '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table/tbody/tr[2]/td[13]/span').exists?
        comp2 = b.element(:xpath => '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table/tbody/tr[2]/td[13]/span')
    end
        #comp3
    if b.element(:xpath => '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table/tbody/tr[3]/td[13]/span').exists?
        comp3 = b.element(:xpath => '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table/tbody/tr[3]/td[13]/span')
    end

Есть ли способ уменьшить его длину, например

if "telement with really long xpath location on the webpage that we are checking to see if it is true ".exists?
    x = "That conditional referenced above"
end

Ответы [ 3 ]

4 голосов
/ 14 июля 2020

Так как вы просто заменяете одно число в этом длинном селекторе xpath, вы можете использовать строку шаблона:

elements = (1..3).map do |x|
  b.element(
   xpath: '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table/tbody/tr[%d]/td[13]/span' % x
  )
end.select(&:exists?)

См. Kernel # sprintf для опций, которые в значительной степени идентична почтенной функции C sprintf.

1 голос
/ 14 июля 2020

Разбейте строку буквально или логически:

# literally
table_xpath = '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table'

if b.element(:xpath => "#{table_xpath}/tbody/tr[1]/td[13]/span").exists?
  #...
end
# logically
table = b.element(xpath: '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table')

if table.element(xpath: "tbody/tr[1]/td[13]/span").exists?
end

разбейте ее столько раз, сколько захотите, чтобы код читался хорошо.

0 голосов
/ 15 июля 2020

Вы можете напрямую написать WATIR CODE, как показано ниже, вы должны использовать elements вместо element

b.elements(:xpath => '/html/body/form/div[3]/div[6]/table/tbody/tr/td/div[2]/div[3]/div[3]/div/div/div[1]/table/tbody/tr')
    .take(3)
    .map{|tr|tr.element(xpath: "./td[13]/span")}

Но все же приведенный выше код не оптимизирован, вы можете написать приведенный ниже код Как только вы найдете таблицу, для приведенного ниже кода я предполагаю, что номер таблицы равен 2.

b.table(index: 2)
.rows
.to_enum
.take(3)
.map{|row| row.cell(index: 13).span}
...