我正在尝试使用Selenium自动化Google Translate网络界面(但是没有必要了解Selenium来理解这个问题,只要知道它找到元素并点击它们)。我一直坚持选择要翻译的语言。
我无法达到下拉菜单打开的程度,如下面的屏幕截图所示。
现在,我想选择'日语'。
这个xpath表达式有效:$b.find_element(:xpath,"//*[@id=':13']/div").click
但我宁愿有一个我只能输入语言名称的地方。
此xpath表达式也有效:$b.find_element(:xpath,"//*[contains(text(),'Japanese')]").click
但只要页面上没有其他“日语”文本。
所以我正在尝试缩小xpath的范围,但是当我尝试指定要查找“日语”文本的路径时,表达式不再有效,我找不到元素:{ {1}}
它也不再适用于原始xpath:$b.find_element(:xpath,"//*div[@id='gt-sl-gms']/*[contains(text(),'Japanese')]").click
这很奇怪,因为要关闭下拉菜单,我使用此xpath $b.find_element(:xpath,"//*div[@id='gt-sl-gms']/*[@id=':13']/div").click
。
所以并不是说我的表情中有两个通配符,而是我的表达方式不太具体。我还缺少其他东西,我确信这很简单。
任何建议都表示赞赏。
编辑我尝试过的其他事情都失败了:
$b.find_element(:xpath,"//*[@id='gt-sl-gms']/*[contains(text(),'From:')]").click
$b.find_element(:xpath,"//*/div[@id='gt-sl-gms']/*[@id=':13']/div").click
$b.find_element(:xpath,"//*[@id='gt-sl-gms']/*[@id=':13']/div").click
答案 0 :(得分:2)
*div
不正确,应该只是div
。此外,根据HTML的结构,您可能需要//
而不是/
。
答案 1 :(得分:2)
尝试选择后代(//)而不是(/ *),这实际上是孙子或更深。
答案 2 :(得分:2)
如果带有“@id =':13'”的div是带有“@ id ='gt-sl-gms”的div的后代,那么你的xpaht "//*[@id='gt-sl-gms']//*[@id=':13']/div"
就可以了。
上面的xpaht期望html看起来像:
<div id="gt-sl-gms">
<div>
<div id=":13">
<div></div>
</div>
</div>
</div>
如果<div id="gt-sl-gms">
不是祖先(正如我所料),您必须寻找“真正的”祖先,或者您可以使用跟随(对于文档后面的节点)或 follow-sibling (对于稍后文档中与之前相同级别的节点。