【问题标题】:How can I simplify xpath for a selenium script? [closed]如何简化 selenium 脚本的 xpath? [关闭]
【发布时间】:2020-01-28 07:44:11
【问题描述】:
driver.find_element_by_xpath("very long xpath").click()

当我尝试在浏览器上自动执行任务时,我有许多“查找元素并与之交互”操作,有哪些方法可以将长 XPath 定位器存储在变量中以跟踪代码是在任务方面,只是为了代码的美观?

路径:

/html/body/main/div[2]/div[6]/div[3]/div[4]/div/div[2]/table/tbody/tr[1]/td[2]
/html/body/main/div[2]/div[6]/div[3]/div[4]/div/div[2]/table/tbody/tr/td/ul/li[1]/h3/a[3]

谢谢!

【问题讨论】:

  • 除非您发布 xpath 的示例,否则很难提出更改建议。有很多方法可用于例如相对 xpath、谓词,您可以尝试。
  • 这取决于html,没有全局方法来缩短所有现有的xpath。
  • 添加了实际路径
  • 了解 html/css 和 javascript 的基础知识,以更好地使用 python 掌握您的网络自动化。简化的方法是简单地将 xpath 添加到列表或变量中,以便在需要的地方轻松传递它们。
  • 您的位置路径严重依赖位置谓词来选择唯一节点。当您对文档语义(标识符、文档中出现的顺序等)一无所知时,这是最常用的方法

标签: python html selenium xpath xpath-1.0


【解决方案1】:

您可以将定位器分配给变量。 python中的一个例子是

loginButtonLocator = (By.ID, 'login')

然后您可以使用它来定位类似的元素

driver.find_element(loginButtonLocator)

对于您的特定 XPath 示例,您可以使用

reallyLongXpathLocator = (By.XPATH, '/html/body/main/div[2]/div[6]/div[3]/div[4]/div/div[2]/table/tbody/tr[1]/td[2]')

并像使用它

driver.find_element(reallyLongXpathLocator)

请参阅Locating Elements 了解更多信息。

正如其他人所建议的那样,非常长的定位器或绝对定位器(两者都适用于您发布的 XPath)是脆弱的。对 HTML 结构的最小更改将导致您的定位器中断,您将不得不重新创建它们。学习如何手工制作自己的定位器是您应该研究的事情。网络上有很多博客和文章可以帮助您通过谷歌搜索。

我建议您查看页面对象。它们使编写自动化(和存储定位器等)变得更加容易和更有条理。请参阅Page Objects 了解更多信息。

【讨论】:

    【解决方案2】:

    这里没有完美的答案,因为它取决于您要提取的很多网页。假设只有一张桌子,在您的情况下使用这些应该是“最安全的”:

    //tbody/tr[1]/td[2]
    //tbody//li[1]/h3/a[3]
    

    【讨论】:

      【解决方案3】:

      没有缩短或简化 的一步解决方案。真正的挑战是构造相对 xpath,即,将 absolute xpath 转换为 relative xpath .


      演示

      作为示例,我们将演示为<input> 元素编写一个相对xpath,其中文本作为小部件按钮内的提交按钮 > 部分,在页面https://demoqa.com/button/ 上如下:


      步骤

      您需要遵循以下步骤:

      1. Google Chrome 浏览器中打开 URL https://demoqa.com/button/
      2. F12Shift + Ctrl + I 打开
      3. Elements 选项卡中,单击元素Inspector 工具:

      1. Mouse Hover 覆盖所需的元素,该元素在 DOM Tree 中突出显示

      1. 右键单击 HTML中的元素,选择复制并选择复制XPath

      1. 你会得到绝对的xpath:

        //*[@id="content"]/div[2]/div/input
        
      2. 要构造relative xpath,按Ctrl + F 打开Search Box .

      1. 现在,开始编写xpath,因为元素是<input>元素,你需要先搜索<input>标签,如下:

        //input
        
      2. 控制台会找到所有的<input>标签,并在右下角返回数字为1 of 2,这意味着找到了2个<input>标签,并且第一个匹配的元素将在 DOM 树 以及网页上突出显示。

      1. 所以,网页上总共有 2 个<input> 标签,现在我们必须使用元素属性来唯一标识所需的元素。
      2. 由于我们想要的元素将属性 value 设置为 A submit button,因此您需要将 attribute 值添加到您的搜索条件中,如下所示:

        //input[@value='A submit button']
        
      3. 你会观察到即使添加了value 属性,元素也不能被唯一标识。

      4. 要唯一标识元素,您需要稍微遍历 HTML,并在我们当前 xpath 的开头添加祖先 <div> 元素 <div class="widget">,如下所示:

        //div[@class='widget']//input[@value='A submit button']
        

      1. 这个 XPath 在 HTML 中唯一标识我们想要的元素,是 relative 的完美示例

      【讨论】:

      • 没有。 //*[@id="content"]/div[2]/div/input 是与//div[@class='widget']//input[@value='A submit button'] 相同的绝对位置路径。这意味着两者都从根开始遍历文档。
      • @Alejandro 您的两个示例都不是绝对路径。绝对路径从/html 开始。在相对 XPath 中,search 从根开始,但它不是绝对 XPath。您可以进行一些谷歌搜索并找到更多信息,但here's a link 有更多信息。
      • @JeffC 不要认为我的话是理所当然的。从规范本身中学习w3.org/TR/1999/REC-xpath-19991116/#NT-AbsoluteLocationPath。底线:位置路径是确定性时的绝对位置路径,它不依赖于上下文节点。
      • @Alejandro 来自您自己的链接... An absolute location path consists of / optionally followed by a relative location path. A / by itself selects the root node of the document containing the context node. 所以我所说的,An absolute path starts from /html 完全符合这个定义。您的两个示例都不是以/ 开头,因此不是绝对的,因此它们必须是相对的。
      • @JeffC 这是我最后的评论。请阅读w3.org/TR/1999/REC-xpath-19991116/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2017-12-22
      • 1970-01-01
      相关资源
      最近更新 更多