我一直在创建一个使用 python 2.7 和 selenium 玩在线游戏的工具,但我非常纠结于我需要选择的一个特定元素。
用户界面如下所示:
1 2 3
a d g
b e h
c f i
数字一、二和三代表一个下拉菜单,单击该菜单将打开字母。每个选项代表不同的结果。问题是,在每场游戏开始时,数字和字母的位置都是随机的。在代码中,每个按钮的 css 选择器被标记为例如“#action-1 > button:nth-child(1)”,如“第一个按钮”,但“第一个按钮”每个游戏都会不同。
我尝试通过链接文本、xpath 和 css 选择器查找,但没有成功。
如果有帮助,请按“复制外部 html”给出:
<button class="ng-binding" ng-click="subBtn($event)" ng-class="{disabled : !state.chapterStart || state.btns.indexOf(btn.action) != -1}" ng-disabled="!state.chapterStart || state.btns.indexOf(btn.action) != -1">Wait and See What They Do</button>
其中的“等待并看看他们做了什么”部分是按钮所说的内容,也是您如何知道要单击什么的方式,但我似乎无法通过它找到该元素。
复制 xpath 的结果是//*[@id="action-1"]/button,这又没有什么帮助,因为告诉它单击它就像说“单击第一位置”,而且每次都会改变。我添加了 long time.sleep() 命令来测试,页面肯定会一直加载,所以这不是问题。
无论如何,我已经尝试解决这个问题太久了,它让我难住了。我将非常感谢你们提供的任何意见。谢谢!
最佳答案
如果您希望通过元素包含的文本来定位元素,则可以使用 XPath。您表示您尝试过 XPath,但没有给出具体信息。您尝试过以下方法吗?根据您提供的 HTML,它应该可以工作。
//button[text()='Wait and See What They Do']
要读取此 XPath...找到任何属于 BUTTON
标记的后代 //
,该标记具有属性 []
,其中文本元素中包含的内容等于搜索字符串,text()=''
。
另一个示例可能如下所示,这是查找按钮的另一种方法。这种方式的问题是,页面上可能有很多具有该类的按钮,因此它可能不够具体。
//button[@class='ng-binding']
我发现(其他人也发现)XPath 通常比其他定位方法慢。因此,我通常更喜欢 By.Id(如果可用),然后是 By.CssSelector。它们都比 XPath 快得多。我将 XPath 保存为诸如在元素中查找文本或查找相关元素之类的东西(CSS 可以做到一些,但远不如 XPath 强大)。
关于Python with Selenium - 由于网站上位置的随机化,无法找到并单击此特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38463264/