我正在尝试使用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)>'
感谢您的时间!
答案 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教程确实使您受益匪浅。