Selenium 如何编写CSS选择器来选择没有特定属性的元素?

Selenium 如何编写CSS选择器来选择没有特定属性的元素?,selenium,selenium-webdriver,css-selectors,webdriver,Selenium,Selenium Webdriver,Css Selectors,Webdriver,如何编写CSS选择器来选择没有特定属性的元素 我有两个节点,如下所示: 第一: <div class="weEq5" style="will-change; width;"> <button class="_35EW6"> 我正在寻找一个等效的CSS选择器 审判: div[class :not(style)]>button (doesn't works). 我已经完成了以下讨论,但他们似乎放弃了class属性,如:而不是([class]),如中所示:

如何编写CSS选择器来选择没有特定属性的元素

我有两个
节点,如下所示:

  • 第一:

    <div class="weEq5" style="will-change; width;">
        <button class="_35EW6">
    
    我正在寻找一个等效的CSS选择器

    审判:

    div[class :not(style)]>button (doesn't works).
    
    我已经完成了以下讨论,但他们似乎放弃了class属性,如
    :而不是([class])
    ,如中所示:


    我在类似的行中查找以
    :not(attribute)

    结尾的内容。通常,您会编写
    :not([style])
    来匹配一个没有
    style
    属性的元素,正如前面所描述的那样,它强调按顺序使用
    ()
    []
    括号


    但是,如果Selenium WebDriver中没有这种功能,更糟糕的是,如果
    :not(style)
    的工作方式与我所期望的
    :not([style])
    完全相同,那么这就是它的CSS选择器解析器的一个缺陷,因为
    :not(style)
    实际上意味着“不是
    style
    元素”,这使得
    div:not(style)
    冗余元素只能是
    div
    样式,但不能同时是两者。除非您绝对需要选择器,否则我强烈建议您使用XPath定位器策略,而不是依赖Selenium WebDriver的CSS选择器引擎中的这种怪癖,这种怪癖迫使您编写的选择器既不正确,也不适用于接受选择器的其他任何地方。

    我认为更准确的CSS选择器是:

    div[class]:not([style])>button
    
    因为
    按钮
    元素是
    div
    元素的子元素


    希望它能帮助你

    这就是您要查找的代码:

    div:not([style]) button{
      background-color: red;
    }
    
    现在让我们把它分解一下。 在本例中,我们有四个选择器:

  • div和button-这些选择html元素。例如,我们可以将其替换为类选择器,如
    .weEq5
  • :not()-表示我们想要括号内不符合选择器条件的所有内容
  • [style]-一种非常强大的。我们可以将任何其他css选择器(如html标记名(按钮或div)、类名或ID)放置在内部
  • div:not([style])
    的组合意味着我们需要所有没有样式属性的div。之后,我们有一个空格和一个按钮,这意味着我们需要上面选择器中的所有按钮


    在按钮
    div:not([style])>按钮之前添加
    将只选择作为所选div直接子级的按钮元素。它将从div内部更深的选择按钮中排除。

    ,页面的结构要求CSS规则知道文档本身是否存在“style=…”。甚至为什么风格=。。。正在使用

    样式属性现在是老式的,我相信是CSS之前的。它还优先于CSS中的任何内容。该属性不接受CSS类名。它只接受本机html样式的属性,如“宽度”、“高度”、“字体”-老派的东西-最终这些都是你的CSS解决的问题,不管它通过框架有多花哨或模糊:字体、宽度、左、上、浮动。。等等

    通过使用文档中的class属性(而不是样式),您可以无限控制在CSS中编写智能选择器


    例如,如果需要,可以在div的class属性中放置3个类,如果其中2个类存在,则让选择器对其应用样式,但如果所有3个类都存在,则不能应用样式。大量的灵活性,根本不需要在文档中重写或使用“style=…”

    您已经有了答案-只需在示例中“类”出现的位置替换为“样式”。@BoltClock已尝试,但未在模板中得到解决。我正在使用
    div:not([style])按钮或
    div[class]:not([style])按钮来解决此问题。
    @BoltClock
    div[class]:not(style)按钮
    似乎工作得很好。@DebanjanB,你说得对。关于排除
    style
    属性的问题
    div:not([style])按钮
    这将定位第二个按钮。你可以利用周围的其他元素使它变得强大。利基思想确实如此。你能帮我理解你用过的这个短语吗?一个元素只能是
    div
    样式,但不能同时是两者。。。因为当我浏览示例时,它是基于
    的,即带有style属性的
    标记。@DebanjanB:标记名是
    div
    :not(style)
    的意思是“标记名不是
    style
    ”。由于
    div
    div
    :not(style)
    对该元素始终为真,就像
    :not(p)
    :not(span)
    对该元素为真一样。这与样式属性无关。谢谢。它现在被清除了<代码>
    本身也是一个标记,这不是我们正在处理的当前用例。style属性是post-CSS。它的语法来自CSS,而不是相反。您列出的“原生html样式属性”不是您所想到的老式表示属性,而是现代(相对而言)CSS属性,它们与其他级联样式表参与相同的级联。事实上,这些天来,呈现属性是使用CSS实现的,尽管我不确定当1996/97年第一批支持CSS的浏览器出现时,它是否以另一种方式实现过。总之,这里的用例不是使用CSS设计元素的样式,从标签中可以看出,这是一个使用SeleniumWebDriver的自动化测试用例,它不涉及应用或重写CSS。
    div[class]:not([style])>button
    
    div:not([style]) button{
      background-color: red;
    }