单击 div 包含带有 selenium python 的特定文本

Posted

技术标签:

【中文标题】单击 div 包含带有 selenium python 的特定文本【英文标题】:click on div contains specific text with selenium python 【发布时间】:2022-01-02 08:03:37 【问题描述】:

我刚开始学习 python 一周,希望我们 selenium 点击包含来自两个不同元素的特定文本的 div 容器。

    <div data-v-38f540f9="" class="order"><h6 data-v-58641c02="" data-v-38f540f9="" class="heading no-wrap" style="--margin-top:0; --margin-bottom:0; --color:rgb(39, 39, 39);">Dagdienst company</h6> <p data-v-49b0fbe1="" data-v-38f540f9="" class="paragraph body no-wrap" style="--color:rgb(39, 39, 39); --margin:0;">Nov 23</p> <div data-v-6e6d111c="" data-v-38f540f9="" class="horizontal work-location-time" style="--margin-left:0; --margin-right:0; --margin-bottom:0; --v-align:baseline; --justify:flex-start; --flex-wrap:nowrap;"><!----> <!----> <span data-v-38f540f9="" aria-label="icon" class="icon medium time" data-v-6e6d111c="" style="--background-color:transparent; --border-radius:0;"><svg xmlns="http://www.w3.org/2000/svg"   viewBox="0 0 56 56">
        <g fill="rgb(68, 179, 230)">
            <path d="M29.71 19v9.65l8.415 4.89-1.395 2.335-9.855-5.86V19h2.835zM28 42.625c2.627 0 5.08-.671 7.356-2.014a14.18 14.18 0 0 0 5.255-5.255A14.234 14.234 0 0 0 42.625 28c0-2.627-.671-5.08-2.014-7.356a14.18 14.18 0 0 0-5.255-5.255A14.234 14.234 0 0 0 28 13.375c-2.627 0-5.08.671-7.356 2.014a14.18 14.18 0 0 0-5.255 5.255A14.234 14.234 0 0 0 13.375 28c0 2.627.671 5.08 2.014 7.356a14.18 14.18 0 0 0 5.255 5.255A14.234 14.234 0 0 0 28 42.625zM28 10c3.288 0 6.332.822 9.13 2.466a17.06 17.06 0 0 1 6.404 6.404C45.178 21.668 46 24.712 46 28c0 3.288-.822 6.332-2.466 9.13a17.06 17.06 0 0 1-6.404 6.404C34.332 45.178 31.288 46 28 46c-3.288 0-6.332-.822-9.13-2.466-2.711-1.587-4.846-3.736-6.404-6.447C10.822 34.288 10 31.26 10 28s.822-6.288 2.466-9.087a17.715 17.715 0 0 1 6.447-6.447C21.712 10.822 24.74 10 28 10z"></path>
        </g>
    </svg></span> <p data-v-49b0fbe1="" data-v-38f540f9="" class="paragraph body no-wrap ellipsis" data-v-6e6d111c="" style="--color:rgb(68, 179, 230); --margin:0;">09:30 | MediaCenter - Rooster</p> <p data-v-49b0fbe1="" data-v-38f540f9="" class="paragraph body no-wrap ellipsis" data-v-6e6d111c="" style="--color:rgb(68, 179, 230); --margin:0;">&nbsp;| test.</p></div></div>

现在我只想单击此 div,前提是它包含 &lt;h6&gt; 中的文本“dienst”和 &lt;p&gt; 中的“Nov 23”

如果我只使用下面的代码查找文本“Nov 23”,我可以工作,但我如何添加额外的检查,并且只有在 div 内的文本还包含 &lt;h6&gt; 中的文本“dienst”时才单击?

today = ("Nov 23")

try:
    order = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.XPATH, "//p[contains(text(),'')]".format(today))))
    print("workorder is found with text", '"' + (order.text) + '"')
    order.click()
except TimeoutException: 
    print("no workorder is found with text", '"' + (order.text) + '"')

【问题讨论】:

尝试在找到p的代码之后添加找到h6的代码,然后进行点击动作,只有在两行都没有报错的情况下才会点击,或者得到元素并比较它是否与您想要的相同 【参考方案1】:

尝试在查找p的后面加上查找h6的代码,然后进行点击动作,只有两行都没有报错才会点击,或者获取元素并比较是否相同你想要的那个。

试试这个:

today = ("Nov 23")

try:
  order = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.XPATH, "//p[contains(text(),'')]".format(today))))
  print("workorder is found with text", '"' + (order.text) + '"')
  
  # I don't know if search by tag name in your case is the
  # best scenario, but you need to adjust if don't
  h6 = WebDriverWait(driver, 3).until(EC.presence_of_element_located(By.TAG_NAME, "h6")))
  if h6.text == 'dienst':
    order.click()
except TimeoutException: 
  print("no workorder is found with text", '"' + (order.text) + '"')

如果不做一些调整,我认为这可以帮助你

【讨论】:

谢谢你,我认为这只有在有一个 p 和一个 h6 元素时才有效,但它可以在同一页面中更多。您建议它搜索单个元素的代码对吗?它必须在同一个链中,换句话说,只有当它在一个具有特定文本的 div 中找到元素时,它才必须是匹配项。为了更容易理解这里只有基本文本和元素 &lt;div&gt;&lt;h6&gt;Dagdienst company&lt;/h6&gt;&lt;p&gt;Nov 23&lt;/p&gt;&lt;/div&gt; 的更简洁的 html 代码,我可以想象它一定是这样的 //div/h6[contains(text(), 'dienst']/p[contains(text(), '')]".format(today) 是的,我不知道整个页面,所以我建议修复一些在页面上只查找一个 h6 的内容,但如果只能找到一个元素,您的想法可能会奏效带有 h6 的 div 命名为 dienst。 我自己上面的命令建议不起作用,

的子元素,如果

的子元素,我的命令应该可以工作。我必须找出如何找到包含两个子

包含文本 &lt;div&gt; &lt;h6&gt;Dagdienst company&lt;/h6&gt; &lt;p&gt;Nov 23&lt;/p&gt; &lt;/div&gt;

元素 我之前从未真正使用过WebDriverWait,所以我的建议不会使用它。当您搜索元素时,您可以堆叠然后,例如:div_order = driver.find_elements(By.CLASS_NAME, "order"),这应该会给您具有“订单”类的 div 列表,然后您在 div 中搜索一个 h6 标记,可能在一个循环内:@987654326 @ 这会给你你想要的 h6 标签,而不是你对 p 标签重复这个过程。

以上是关于单击 div 包含带有 selenium python 的特定文本的主要内容,如果未能解决你的问题,请参考以下文章

单击特定的标签时,我希望显示下面的 div,其中包含其他链接

单击不适用于 Selenium 的元素

无法使用selenium单击div按钮

如何在 C# 中单击带有 Selenium 的 JS 链接

当我单击带有 selenium 的搜索按钮时,网站会重新加载

Selenium 和 xpath:找到一个带有类/ID 的 div 并验证里面的文本