【问题标题】:Selenium, understanding xPath; Input vs Select; cycle through elementsSelenium,了解 xPath;输入与选择;循环遍历元素
【发布时间】:2021-10-12 08:54:39
【问题描述】:

在我正在工作的网页上,我可能会遇到两种类型的输入字段(视情况而定) - 它将是选择或输入,具有以下示例 xPath:

案例选择

/html/body/div[1]/section/div/div/div/div/form/div[1]/div/div[4]/div[2]/div/div/div/div[1]/div[1]/table/tbody/tr[20]/td[3]/div/select

案例输入

/html/body/div[1]/section/div/div/div/div/form/div[1]/div/div[4]/div[2]/div/div/div/div[1]/div[1]/table/tbody/tr[19]/td[3]/div/input

因为我不知道字段类型是什么,所以我将使用以下 sytnax:

/html/body/div[1]/section/div/div/div/div/form/div[1]/div/div[4]/div[2]/div/div/div/div[1]/div[1]/table/tbody/tr[20]/td[3]/div/*
  1. 据我了解,当我使用 selenium driver.find_element_by_xpath 并带有“*”路径示例时,代码将返回符合条件的第一个元素?
    如何使用“查找下一个”之类的内容?

  2. 如何区分输入和选择字段?
    我尝试了以下方法:

  • obj.get_attribute("type") -> 返回“文本”
  • obj.get_attribute("class") -> 返回“form-control variant-value variant1”
  • obj.get_attribute("//xpath@class") -> 返回“无”
  • obj.tag_name - 返回“输入”
  • ob.text -> 返回 ""

    我希望像“选择”或“输入”这样的回报。
    在哪里可以找到与我可以在“get_attribute”中编写的内容相关的文档?

    谢谢。

【问题讨论】:

    标签: python selenium xpath


    【解决方案1】:

    第一个问题:

    据我了解,当我使用 selenium driver.find_element_by_xpath 并带有“*”路径示例时,代码会返回符合条件的第一个元素吗? 如何使用“查找下一个”之类的内容?

    回答:是的,它会返回第一个元素,如果你想要所有元素,请切换到find_elements。对于这个How can I use something like "find next"? - 你说的下一个是什么意思? - 我假设作为下一个兄弟,如果是这样的话,那么你可以使用::followin-sibling

    第二个问题:

    How can I distinguish between Input and Select field?
    

    xpath 非常简单:-

    //input 
    

    要选择所有输入,您可以使用//input[attribute_name='attribute_value'] 来区分黑白输入字段。

    //select
    

    并且可以像这样更有建设性地使用它:

    //select[attribute_name='attribute_value']
    

    现在,

    I would expect return like "Select" or "Input".
    

    您可以使用tag_name,如下所示:-

    obj.tag_name
    

    打印这个,你应该得到合适的标签名称。

    Where can I find documentation related to what can I write inside "get_attribute"?
    

    get_attribute是获取属性值,为指定的web元素->属性名。

    官方是这样说的:

    get_attribute(name) 获取给定的属性或属性 元素。

    此方法将首先尝试返回具有 给定的名称。如果具有该名称的属性不存在,则返回 同名属性的值。如果没有属性 使用该名称,将返回 None。

    被认为是真实的值,即等于“真”或“假”, 以布尔值返回。所有其他非无值返回为 字符串。对于不存在的属性或属性, None 是 返回。

    在这里找到get_attribute的官方文档

    【讨论】:

    • 1) 我如何使用::followin-sibling 2) 一次输入可能是常规的 *\Input,另一次可能是 *\Select。无论如何我可以识别我找到的元素是输入还是选择? obj.tag_name总是返回“输入”,就好像没看出区别
    • 我如何使用::followin-sibling,这基本上是xpath轴,看这里w3schools.com/xml/xpath_axes.aspobj.tag_name always return "input", it's like it does not see difference这取决于你的xpath,你传递了什么xpath?
    【解决方案2】:
    1. 您可以使用driver.find_elements_by_xpath,而不是driver.find_element_by_xpath
      这将为您提供与传递的定位器匹配的所有元素,因此在您的情况下
    elements = driver.find_elements_by_xpath("your_xpath")
    

    elements[0] 将为您提供匹配your_xpath 的第一个元素,而匹配your_xpath 定位器的第二个元素将为elements[1]
    2) 要获取已选择元素的标签名称,您可以使用obj.tag_name 方法。
    要明确选择所需的元素,您可以在 XPath 定位器中提及它的标签名称,这样所选元素将是所需的类型。
    您可以使用 //*parent_elements//select 之类的东西来获取 Select 元素,并相应地使用 //*parent_elements//input 来获取输入元素。
    至于 get_attribute 方法 - Cruisepandey 已经将您推荐给文档。我只是想澄清一下,属性不包括标签名称。所以,标签名不是元素的属性。

    【讨论】:

    • 有什么方法可以检查我是否从 find_element_by_xpath("/html/body/div[1]/section/div/div/div/div/form/div[1]/div/div[4]/div[2]/div/div/div/div[1]/div[1]/table/tbody/tr[20]/td[3]/div/*") 收到 *\Input 或 *\Select?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多