我希望尽可能避免在webdriver中查找元素时使用XPath,但是能够引用已经找到的元素中的子元素,例如。
对于以下html:
<div id="myelement">
<table class="myclass">
<tbody>
<tr>
<td>something</td>
<td>
<table>
<tbody>
...
</tbody>
</table>
</td>
</tr>
<tr>
...
</tr>
</tbody>
</table>
</div>
我有一个css表达式:
driver.find_elements('div#myelement table.myclass&gt; tbody&gt; tr')
我想将其分解为表元素和行,而不必返回表表达式。例如对于XPath:
table = driver.find_element(:xpath, "//div[@id='myelement']//table[@classname='myclass']")
rows = table.find_elements(:xpath, 'tbody/tr')
我尝试了以下内容,它使用JQuery $('div#myelement table.myclass')。find('&gt; tbody&gt; tr')
table = driver.find_element(:css, 'div#myelement table.myclass')
rows = table.find_elements(:css, '> tbody > tr')
这会导致错误`assert_ok':指定了无效或非法的字符串(Selenium :: WebDriver :: Error :: UnknownError)
删除第一个'&gt;'当然是有效的,但意味着选择了后人,而不仅仅是直接的孩子。
如何只使用css正确执行此操作?
答案 0 :(得分:5)
由于你没有给出页面网址,我接受了这个Chinese language。现在我试图找出第一个表格第class
名{{1}的第二行的表格列值}}
"wikitable sortable
您尝试require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://en.wikipedia.org/wiki/Chinese_language"
table = driver.find_element(:css,"table.wikitable") # !> assigned but unused variable - table
tb_col = driver.find_elements(:css,"tr:nth-of-type(2)>td")
tb_col[0..5].each{|e| p e.text}
# >> "汉语/漢語 or 中文\nHànyǔ or Zhōngwén"
# >> "汉语"
# >> "中文"
# >> "Wu\nNotes: includes Shanghainese"
# >> "Wu; 吴/吳"
# >> "Wúyǔ"
的方式不是table.find_elements(:css, '> tbody > tr')
中的有效css语法。它应该是selenium-webdriver
。我建议您这样写:
table.find_elements(:css, 'tbody > tr')
table = driver.find_element(:css, 'div#myelement table.myclass>tbody')
rows = table.find_elements(:css, 'tr')