如何定位元素?选择器错误(水豚)

时间:2019-06-04 20:12:45

标签: ruby selenium-webdriver capybara

我正在尝试使用page.find使用文本变量来定位元素(两个元素均未完全完成),但是当我尝试使用定位器时,出现错误:无效选择器:无效或指定了非法选择器。

我不知道方法是否错误或问题出在html元素。

执行“ test1”         访问“ https://www.americanas.com.br/

    $name = box for all the boys i've loved
    $author = Jenny Han

    fill_in 'h_search-input',   with: $isbn
    click_button 'h_search-btn'

    americanas = page.find($name).text      # <- here is the error
    americanas.click

    expect(find('table tbody tr')).to have_content $author
end

HTML元素:

<h1 class="TitleUI-sc-1m3ayw0-16 cvOkHP TitleH1-c6mv26-0 VyqrE" icon="[object Object]">Box Book - For All The Boys I've Loved</h1>

<tr class="table-content__Tr-sc-6kkk7q-3 jFIPzA"><td class="table-content__Td-sc-6kkk7q-5 bPPRTT"><span class="text__TextUI-sc-1hrwx40-0 cKQvNJ">Author</span></td><td class="table-content__Td-sc-6kkk7q-5 bPPRTT"><span class="text__TextUI-sc-1hrwx40-0 cKQvNJ">Jenny Han</span></td></tr>

我得到了什么

 1) test test1
 Failure/Error: americanas = page.find($name).text

 Selenium::WebDriver::Error::InvalidSelectorError:
   invalid selector: An invalid or illegal selector was specified
     (Session info: chrome=74.0.3729.169)
     (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 6.1.7601 SP1 x86_64)
 # ./spec/teste_spec.rb:30:in `block (2 levels) in <top (required)>'

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

find采用选择器类型(默认为:css),定位器和选项-并返回单个匹配元素。在您的代码中

americanas = page.find($name).text
americanas.click

您没有将选择器类型传递给find,因此假定它是:css,但是随后您传递了随机的文本字符串(我假设它是字符串,但是在您的字符串中没有引号代码吗?)这不是有效的CSS选择器-因此出现错误。之后,您要对text的结果调用find,如果发现正确,它将从元素中获取文本(作为字符串),然后对click进行调用由于click仅在元素上受支持,因此没有任何意义的字符串。我想你想做的是

page.find('h1', text: $name).click

但是,即使这样也会失败,因为您有$name = "box for all the boys i've loved",但是h1的内容是“ Box Book-For All Boys I Loved Boys”,内容或大小写都不匹配。您可以通过执行类似

的操作来使用不区分大小写的正则表达式
page.find('h1', text: /for all the boys i've loved/i).click 

但这完全取决于您实际上要做什么。

然后,假设您的表有多个表行,那么您的期望可能需要类似

expect(page).to have_selector('tr', text: $author)

注意:基于您一直在问的问题,阅读Capybara文档和一些ruby教程确实使您受益匪浅。

相关问题