【问题标题】:How to match multiple element tags with single XPath如何将多个元素标签与单个 XPath 匹配
【发布时间】:2016-09-08 10:29:07
【问题描述】:

我想创建一个允许填写注册、授权和其他文本表单的函数。比如:

def fill_form(my_list):
    forms = driver.find_elements_by_xpath(common_xpath)
    for element in forms:
        element.send_keys(my_list[forms.index(element)])

它应该将文本值列表作为参数发送到<input type="text">、<input type="password"> 和<textarea> 元素。

到目前为止我有:

common_xpath ='//input[@type="text" or @type="password"]'

但我不明白如何将 textarea 元素添加到此 XPath 以使其也匹配

【问题讨论】:

  • 你能上传一些 HTML(或者,如果可能的话,一个网站的链接)?
  • 这适用于所有包含用户名、密码和类似描述或评论字段的注册表单...我在非公共网络应用程序上工作,但我会尝试找到类似的
  • @RobertoS.,事实上你可以使用这张票的页面:)Search Q&A右上角的输入字段是一个<input type="text">元素,如果点击下面的add a comment链接你会得到<textarea> 元素。我需要匹配两个元素的XPath
  • 我不完全确定我理解你的问题。您是否试图以多种形式获取所有表单或所有元素?如果是第一个你可以使用 xpath 的 |它允许您一次使用多个定位器,如果它与这些定位器中的任何一个匹配,则返回一个元素。
  • 对于 cssSelector,你只需要在两个 cssSelector 之间添加 ,

标签: python selenium xpath selenium-webdriver


【解决方案1】:

不确定这是否能满足您的要求,但是,据我所知,这个 Xpath 可以完成工作:

common_xpath = "//*[self::input[@type='text'] or self::input[@type='password'] or self::textarea]"

我没有用 Python 编程,但在 Chrome 的控制台中尝试了那个(使用$x("...")),它似乎可以满足您的需求。您应该考虑在表单 (path/to/your/form//*...) 中调用该 XPath,以使其更具体。

你可以在 Xpath 中选择不同的标签 :)

查看this related answer了解更多信息。

最后,作为个人说明,我对 Selenium 没有那么丰富的经验,但我建议您考虑使用 PageObject 模型设计模式,以使测试更易于维护。希望它对你有用。

【讨论】:

    【解决方案2】:

    一个更简单、更面向未来的策略是将 XPath 表达式分成 2/3 个不同的表达式来搜索所需的 WebElement,但是如果您真的需要使用单个 XPath 表达式,我想您可以使用 | operator 来设计一些类似的东西:

    //input[@type="text" or @type="password"] | //textarea

    【讨论】:

    • 是的。这行得通。出于某种原因,我最初尝试使用 | | 运算符 :) 单 | 做到这一点
    【解决方案3】:

    我不知道 Python,但这是我会在 JAVA 中做的事情

    String [] commanXpath= {"text", "password"};
    
    
    
    String xpathVar= "//input[@type='"+commanXpath[index]+"']";
    System.out.println(xpathVar);
    By common_xpath= By.xpath(xpathVar);
    

    看看你是否可以在 Python 中实现类似的逻辑。你也可以用精确的 html 标签更新原始帖子吗?

    【讨论】:

    • 这可能仅适用于具有不同类型的 input 元素,例如 text、password、checkbox... 但我也需要匹配 textarea 元素。它不是input 元素类型,而是不同的元素
    • 您总是可以编写 xpath 来匹配所有标签。 String xpathVar= "//*[@type='"+commanXpath[index]+"']";如果你能粘贴html标签,我也许可以提供更好的解决方案。
    • 我展示了所有必需的 HTML 标签:input 和 textarea。我需要在单个 XPath 中同时使用它们
    • 只要 webelements 的 xpath 有任何共同点,您就可以编写它,例如类名、父级、任何属性值。您需要找出共同的价值,您可以将所有 Web 元素放入列表中,然后遍历该列表。至于匹配所有标签,我已经在上面的评论中给出了解决方案"//*" 这将匹配所有标签。
    • 我只需要可以用文本填充的元素,而不是页面上的所有元素
    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多