Нажатие на текстовое исключение (Ruby / Selenium Webdriver) - PullRequest
0 голосов
/ 15 января 2019

Сейчас я пытаюсь использовать каждое из них, чтобы найти тексты. Когда объект <td align="left">GOLD</td> не отображается, Руби будет пытаться нажать на <td align="left">STANDARD</td>, и он будет продолжать находить один за другим, пока ему не удастся найти и щелкнуть. На мой последний вопрос Раджагопалан помог мне с этим кодом:

["04", "08", "10", "12"].each do |num|
  begin
    browser.find_element(:id, "ctl00_ContentPlaceHolder1_ucCancBloqRem_gridListCartoes_ctl00_ctl06_Detail10_ctl#{num}_btnCancelarOn").click
    el3 = browser.find_element(:id, "ctl00_ContentPlaceHolder1_ucCancBloqRem_gridListCartoes_ctl00_ctl04_GECBtnExpandColumn")
    browser.action.double_click(el3).perform
    break
  rescue
  end
end

Поэтому я попытался поместить текст вместо цифр (это действительно возможно?):

["GOLD", "STANDARD", "ELO", "DIGITAL"].each do |var|
        begin
          browser.find_element(:xpath => '//td[.="{var}"]')
          el3 = browser.find_element(:xpath => '//td[.="{var}"]')
          browser.action.double_click(el3).perform
        break
      rescue Selenium::WebDriver::Error::NoSuchElementError
     end
    end

И получил ошибку:

C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok': no such element: Unable to locate element: {"method":"id","selector":"ctl00_ContentPlaceHolder1_ucInfoCliente_lblCpf"} (Selenium::WebDriver::Error::NoSuchElementError)
  (Session info: chrome=71.0.3578.98)
  (Driver info: chromedriver=2.44.609538 (b655c5a60b0b544917107a59d4153d4bf78e1b90),platform=Windows NT 6.1.7601 SP1 x86_64)
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:32:in `initialize'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in `new'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in `create_response'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/default.rb:104:in `request'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:62:in `call'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/bridge.rb:166:in `execute'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/oss/bridge.rb:584:in `execute'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/oss/bridge.rb:552:in `find_element_by'
    from C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/search_context.rb:60:in `find_element'
    from C:/test/normaliza conta.rb:58:in `<main>'
[Finished in 47.5s with exit code 1]
[shell_cmd: ruby "C:\test\normaliza conta.rb"]
[dir: C:\test]
[path: C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\DTS\Binn\;C:\Program Files\Microsoft SQL Server\120\DTS\Binn\;C:\Ruby25-x64\bin]

Я тоже пытался сделать больше исключений, но тоже получил ошибку в этом коде

begin 
    browser.find_element(:xpath => '//td[.="DIGITAL"]').click
    el = browser.find_element(:xpath => '//td[.="STANDARD"]')
    browser.action.double_click(el).perform     
rescue Selenium::WebDriver::Error::NoSuchElementError
    browser.find_element(:xpath => '//td[.="ELO"]').click
    el20 = browser.find_element(:xpath => '//td[.="ELO"]')
    browser.action.double_click(el20).perform   
rescue Selenium::WebDriver::Error::NoSuchElementError
    browser.find_element(:xpath => '//td[.="STANDARD"]').click
    el21 = browser.find_element(:xpath => '//td[.="STANDARD"]')
    browser.action.double_click(el21).perform       
rescue Selenium::WebDriver::Error::NoSuchElementError
    browser.find_element(:xpath => '//td[.="GOLD"]').click
    el22 = browser.find_element(:xpath => '//td[.="GOLD"]')
    browser.action.double_click(el22).perform
end

В этом случае он останавливается на втором элементе («ЭЛО») и не достигает третьего («СТАНДАРТ») и далее («ЗОЛОТО»). (Попытка пройти через ELO и DIGITAL, чтобы достичь СТАНДАРТА, который присутствует в моем тесте.)

*** WARNING: You must use ANSICON 1.31 or higher (https://github.com/adoxa/ansicon/) to get coloured output on Windows
C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok': no such element: Unable to locate element: {"method":"xpath","selector":"//td[.="ELO"]"} (Selenium::WebDriver::Error::NoSuchElementError)

Но тоже получил эту ошибку. Любые советы о том, что я могу сделать?

1 Ответ

0 голосов
/ 15 января 2019

Вы экстраполируете строку неправильно

a=23
Correct one: "something'#{a}'is correct"
wrong one  : 'something"#{a}"is correct'

Так что используйте этот

["GOLD", "STANDARD", "ELO", "DIGITAL"].each do |var|
  begin
    browser.find_element(:xpath => "//td[.='#{var}']")
    el3 = browser.find_element(:xpath => "//td[.='#{var}']")
    browser.action.double_click(el3).perform
    break
  rescue Selenium::WebDriver::Error::NoSuchElementError
  end
end

Вам лучше использовать normalize-space(.), который уберет начальное и конечное пространство

["GOLD", "STANDARD", "ELO", "DIGITAL"].each do |var|
  begin
    browser.find_element(:xpath => "//td[normalize-space(.)='#{var}']")
    el3 = browser.find_element(:xpath => "//td[normalize-space(.)='#{var}']")
    browser.action.double_click(el3).perform
    break
  rescue Selenium::WebDriver::Error::NoSuchElementError
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...