代码之家  ›  专栏  ›  技术社区  ›  Arount

Selenium:如何处理DOM中无效的CSS选择器

  •  0
  • Arount  · 技术社区  · 4 年前

    我正在用Selenium/Python3创建一个网站,该网站只使用无效的选择器,如:

    <input id="egg:bacon:SPAM" type="text"/>
    <input id="egg:sausages:SPAM:SPAM" type="text"/>
    

    egg:bacon:SPAM &安培; egg:sausages:SPAM:SPAM )

    driver.find_element_by_css_selector('input#egg:bacon:SPAM')
    

    但我当然知道 selenium.common.exceptions.InvalidSelectorException


    driver.find_element_by_xpath('//input[@id="egg:bacon:SPAM"]')
    

    但是我的代码基于一个基于CSS选择器的自制库。添加XPATH支持将需要添加大约200行代码(不包括单元测试、文档等)来处理这种错误的而非一般的行为。

    另外,删除这个网站是一个更大项目的一部分,在这个项目中,只有这个特定的网站使用那种CSS选择器,在10个网站上花那么多精力让我很不舒服。


    我可以用一些像 find_element_by_css_selector('.foo > input:nth-child(2)')

    有吗 清洁的 find_element_by_css_selector 或者我注定要在这个网站上使用XPATH?

    2 回复  |  直到 4 年前
        1
  •  2
  •   Sers    4 年前

    它们都是有效的。您需要转义特殊字符或使用引号:

    driver.find_element_by_css_selector('input[id="egg:bacon:SPAM"]')
    driver.find_element_by_css_selector('input#egg\:bacon\:SPAM')
    
        2
  •  1
  •   undetected Selenium    4 年前

    id 属性包含 保留 字符,例如。 鸡蛋:培根:垃圾邮件 , 你可以使用动态

    • ^ :指示属性值 开始于
    • * :指示属性值
    • $ :指示属性值 以结束

    解决方案

    您可以使用以下解决方案:

    • 识别元素 <input id="egg:bacon:SPAM" type="text"/> :

      driver.find_element_by_css_selector("input[id^='egg'][id*='bacon'][id$='SPAM']")
      
    • 识别元素 <input id="egg:sausages:SPAM:SPAM" type="text"/>

      driver.find_element_by_css_selector("input[id^='egg'][id*='sausages'][id$='SPAM']")
      

    参考

    您可以在中找到一些相关的讨论: