【问题标题】:How to wait and get the status of web element using selenium webdriver and python如何使用 selenium webdriver 和 python 等待并获取 web 元素的状态
【发布时间】:2018-08-03 13:24:11
【问题描述】:

我正在尝试检查状态从"Running" 更改为"Success"<td> 元素的状态。状态更改可能需要大约 1 分钟或每隔几秒钟我需要重试检查元素的状态。有人可以帮助我如何实现这一点,以下是我正在尝试的 html 结构和 sn-p。

跑步

<tbody id="workflows">
<tr id="row8ff2244a64f3e7180164ff637c574d24" class="selected">
<td><span class="wf-status running" id="status8ff2244a64f3e7180164ff637c574d24">Running</span></td>
<td>Copy of Discovery v4madhu-test3-automate</td>
<td>03 Aug 16:14</td>
<td>autotest</td>
<td>dmatarget14.hpeswlab.net</td>
<td></td>
<td></td>
</tr>
</tbody>

成功

<tbody id="workflows">
<tr id="row8ff2244a64f3e7180164ff637c574d24" class="selected">
<td><span class="wf-status wfsuccess" id="status8ff2244a64f3e7180164ff637c574d24">Success</span></td>
<td>Copy of Discovery v4madhu-test3-automate</td>
<td>03 Aug 16:14</td>
<td>autotest</td>
<td>dmatarget14.hpeswlab.net</td>
<td></td>
<td></td>
</tr>
</tbody>

示例代码

timeout = 60
maxtime = time.time() + timeout
result = None
while result is "SUCCESS":
    try:
        # connect
        result = driver.find_element_by_xpath('//td[contains,"dmatarget14.hpeswlab.net"] and td[contains,"Success"]/ancestor::tr')
        time.sleep(5)
    except:
        if time.time() > maxtime:
            raise Exception

【问题讨论】:

    标签: python selenium selenium-webdriver xpath css-selectors


    【解决方案1】:

    您可以申请以下解决方案:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    timeout = 60
    
    WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.XPATH, '//tbody[@id="workflows"]//td[.="Success"]')))
    

    此代码应允许您最多等待 60 秒,并在 td 与文本 Success 出现在 DOM 或 TimeoutException 时返回 True,以防 60 秒后没有出现任何元素

    【讨论】:

    • 这个,但我会使用 css-selector 而不是 xpath-selector 来使选择器更易于处理和更具可读性。 OP虽然使用xpath,所以我理解你为什么在答案中使用xpath
    • CSS 选择器(在 Selenium 中)不允许您通过其文本内容定位元素。如果 OP 想等待 "Success" 我认为最好使用这个选择器。但可能还有很多其他选择..
    • td-element 将类从 running 更改为 wfsuccess,这 imo 是一个比查看文本更强大的选择器,但是是的,我明白你的意思。 css-selector 类似于“td.wfsuccess”,甚至更好的是“#status8ff2244a64f3e7180164ff637c574d24.wfsuccess”,即使 ID 看起来是自动生成的(我认为这是代码异味)
    • @Andersson my td 对于每个 tr 都是唯一的 (dmatarget14.hpeswlab.net )。你能帮忙正确的 XPATH 表达式吗
    • //tbody[@id="workflows"]//td[.="Success" and following-sibling::td[.="dmatarget14.hpeswlab.net"]]
    【解决方案2】:

    你可以试试这个代码:

    WebDriverWait(driver, 60).until(
        EC.presence_of_element_located((By.XPATH, '//td[contains,"dmatarget14.hpeswlab.net"] and td[contains,"Success"]/ancestor::tr'))
    

    【讨论】:

      【解决方案3】:

      要验证 &lt;td&gt; 元素的状态以将文本从 Running 更改为 Success,您可以使用以下任一解决方案:

      • text_to_be_present_in_elementCSS_SELECTOR

        element = WebDriverWait(driver, 20).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "tbody#workflows>tr.selected>td>span.wf-status.wfsuccess"), "Success"))
        
      • text_to_be_present_in_element_valueCSS_SELECTOR

        element = WebDriverWait(driver, 20).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR, "tbody#workflows>tr.selected>td>span.wf-status.wfsuccess"), "Success"))
        

      【讨论】:

        猜你喜欢
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 2012-03-26
        • 1970-01-01
        • 2016-12-25
        相关资源
        最近更新 更多