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

How to locate element? Illegal selector error (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)>'

感谢您的宝贵时间!

find 采用选择器类型(默认为 :css)、定位器,然后是选项 - returns 是单个匹配元素。在您的代码中

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

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

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

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

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

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

然后,假设您的 table 有不止一个 table 行,您的期望可能需要类似于

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

注意:根据您一直在问的问题,您似乎真的可以从阅读 Capybara 文档和一些 ruby 教程中受益。