Selenium-Python-根据父类名称单击子元素

时间:2019-07-10 19:01:24

标签: python selenium xpath

我正在使用硒浏览网页,然后单击各种按钮来执行各种任务。到目前为止,我单击的每个按钮都有某种唯一的标识符,可让我准确定位并单击该元素。但是,有一个按钮与同一页面上的其他按钮共享所有标识符(即无法直接识别此标识符)。此按钮是具有唯一标识符类的元素的后代(以下7代)。

页面按钮是动态的,因此每次加载页面时,许多元素都会更改属性。

我已经尝试过彩虹下的每种组合以单击此按钮,但是没有找到任何解决方案。

以下是我尝试过的一些方案: 1。

ele = browser.find_element_by_xpath("//*[@class='firsttile']//*[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
ele.click()

2。

ele = browser.find_element_by_xpath("//*[@class='firsttile']/*/[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
ele.click()

3。

ele = browser.find_element_by_xpath("//*[@class='firsttile']*/*[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
ele.click()

4。

ele = browser.find_element_by_xpath("//*[@class='firsttile']///////[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
ele.click()

这是按钮:

<button class="md-icon-button md-accent md-button md-ink-ripple md-default-theme" type="button" ng-transclude="" ng-click="$mdOpenMenu($event)" aria-haspopup="true" aria-expanded="false" aria-owns="menu_container_338">

这是唯一标识符为firsttile的父母

<measure-tile measure-info="measure" ng-class="measure.lookup + 'Tile'" class="firsttile">

任何帮助或见识将不胜感激!堆栈上的内容或其他网站都没有帮助我解决此问题。预先感谢。

编辑: 我在此处附加了完整的DOM路径。最初,我发布了类名称为“ firsttile”,但在我的文章中取消了对它的标识。真正的类名称是“ ontimestartsTile”。 enter image description here

我在这里附上了我最近的尝试:

parent = browser.find_element_by_class_name('firsttile');
    button = parent.find_element_by_xpath("//*[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
    button.click()

5 个答案:

答案 0 :(得分:0)

您使用的XPathing非常具体。我会尝试以下方法:

//*[@class="firsttile"]/div/div/span/div/whatever/[contains(@class,"md-icon-button")]

答案 1 :(得分:0)

我对python不熟悉,但它与其他语言几乎相同。希望这对您有所帮助,是供参考的C#代码

  1. 如果您的按钮具有从父节点开始的子树中唯一的类,请使用以下代码参考

    IWebElement parent= driver.FindElement(By.XPath("first time"));
    var myButton= parent.FindElements(By.XPath("//div[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']"));

现在,如果您不确定元素属性的唯一性(在您的情况下是类),则可以使用以下方法列出元素。

List<IWebElement> Managers = parent.FindElements(By.XPath("//div[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")).ToList();
  1. 如果列表中有多个元素,则应该使用绝对XPath。

    注意:-如果从Firefox复制XPath,则大多数情况下将获得绝对的XPath,而另一面的chrome将为相对。有时候,如果浏览器不能提供绝对的价值,那么您必须自己创建。

我希望这个锻炼对您有用。如果您可以共享链接或检查显示完整DOM的元素快照,我可以为您提供更好的帮助。谢谢:-)

答案 2 :(得分:0)

我能够用适当的语法弄清楚。我首先必须将父对象定义为变量,然后使用该变量标识子按钮。这是我的解决方案:

element = browser.find_element_by_class_name('ontimestartsTile')
element.find_element_by_xpath('.//button[@class="md-icon-button md-accent md-button md-ink-ripple md-default-theme"]').click()

答案 3 :(得分:0)

最简单的方法是通过class attribute找到父对象,然后使用descendant axis查找按钮,例如:

//measure-tile[@class='firsttile']/descendant::button

更多信息:

答案 4 :(得分:0)

最好的解决方案是使用方法“ find_element_by_css_selector()”。这是最可靠的方法。一线解决方案:

mTextView.setText(Html.fromHtml("THIS USEFUL INTERESTING HTML TEXT IS DISPLAYED IN ANDROID TEXT VIEW"));