文本异常单击(Ruby / Selenium Webdriver)

时间:2019-01-15 12:44:37

标签: ruby selenium-webdriver

我正在尝试使用每个do来查找文本。当没有显示对象<td align="left">GOLD</td>时,Ruby将尝试单击<td align="left">STANDARD</td>,他将继续一个接一个地查找,直到成功找到并单击为止。关于我的最后一个问题,Rajagopalan帮助我编写了以下代码:

["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”)上,没有到达第三个元素(“ STANDARD”)来回(“ GOLD”)。 (尝试通过ELO和DIGITAL达到我的测试中显示的STANDARD。)

*** 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 :(得分:0)

您以错误的方式推断字符串

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