【问题标题】:Getting span text(value) every time it changes in selenium python每次在 selenium python 中更改时获取跨度文本(值)
【发布时间】:2020-09-17 08:13:07
【问题描述】:

我试图在每次更改时打印跨度的值。打印 span 的值非常简单:

popup = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="spot"]')))

Print(popup.text)

这将打印当时的值,问题是该值将每 2 秒更改一次。我尝试使用:

# wait for the first popup to appear
popup = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="spot"]')))
# print the text
print(popup.text)
# wait for the first popup to disappear
wait.until(EC.staleness_of(popup))

# wait for the second popup to appear
popup = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="spot"]')))
# print the text
print(popup.text)
# wait for the second popup to disappear
wait.until(EC.staleness_of(popup))
无论我的等待值有多长,10 或 20 甚至 30 秒,该过程总是超时。我对编码知之甚少,但我认为这种方法不起作用,因为整个跨度不会仅改变跨度值(文本)。我尝试的一种方法是循环Print(popup) 命令,它部分工作。它打印了 489 次相同的值,直到它改变并再次打印了另一个 489 次。我已经尝试过这段代码:

popup = wait.until(EC.text_to_be_present_in_element_value((By.XPATH, '//*[@id="spot"]')))
print(popup.text)
但它返回:

TypeError: __init__() missing 1 required positional argument: 'text_'
.

请帮助我需要添加什么或者我需要使用什么方法来获取更改的值。

HTML code inspection

求求你,请注意我没有尝试打印跨度的文本,我已经知道该怎么做,我想在每次更改时打印它

【问题讨论】:

    标签: python html selenium text


    【解决方案1】:

    假设元素确实消失并再次出现:

    您可以在等待元素被定位和被定位之间来回切换。

    假设元素内容发生变化,但没有消失:

    我不知道等待元素内容更改的任何显式方法,因此就我而言,您需要自己比较更改。您可能需要添加

    # Init a list to contain the values later on
    values = []
    
    # Wait for the element to be loaded in the first place
    popup = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="spot"]')))
    
    values.append(popup.text)
    
    
    while True:
    
        # possibly wait here
        
        new_value = driver.find_element(By.XPATH, '//*[@id="spot"]')
        
        # look up if the value has changed based on the values you know and add the new value
        if values[-1] != new_value:
            values.append(new_value)
    
        # add an exit condition unless you actually want to do it forever
    
    

    请注意:这仅在值每次都实际更改或您不需要彼此跟随的重复项时才有效。 如果您需要每个值,则可以省略比较并每 ca 添加一个值。 2 秒。

    以您为例: 您提供的 binary.com 上的页面使用 websocket 来刷新内容。这是一个允许服务器向客户端发送数据的协议,反之亦然。 因此,这是您习惯的 http 协议的不同方法(您发送请求,服务器回复 - 假设您请求网页,然后服务器将发送它)。

    此协议打开一个连接并使其保持活动状态。几乎不会等待预期这种变化。但是:在您的浏览器中(假设是 Chrome),您可以进入您的开发人员工具,进入“网络”选项卡并过滤 WS(websocket)。您将看到与 v3?app_id=1 的连接(您可能需要刷新页面才能在 Network-Tab 中获得输出)。 单击该连接,您将看到您的客户发送的消息和您收到的消息。当然,您只需要收到的那些,因此请过滤掉那些。

    由于这些步骤相当多,请看一下屏幕截图,它显示了正确的设置:

    每条消息都是 json 格式,您可以单击它查看其内容。在“tick”下,您会看到询价和出价数据。 如果足够了,您可以根据需要将页面保持打开状态,然后复制输出,将其保存为文件并使用 python 读取以进行分析。

    您似乎也可以使用 selenium 自动执行此操作,如下所示: http://www.amitrawat.tech/post/capturing-websocket-messages-using-selenium/

    基本上他们做同样的事情,他们设置了记录日志的能力,然后通过它过滤以获得他们需要的数据。请注意,他们使用 Java 来执行此操作 - 但翻译成 python 并不难。

    【讨论】:

    • 感谢您的回答,我无法使用比较方法,因为有重复。此外,我使用了每 2 秒添加一次值的方法,它可以工作,但我的问题是准确性和时间,假设脚本在(秒:毫秒)00:999 读取并打印一个数字,并且之间还有其他命令第一次打印和下一次打印,下一次打印不会像预期的那样在 (seconds:milliseconds)02:999,因此打印不正确。我需要过时方法的原因是,当数字(元素内容)发生变化时,它每 02:000 打印一次是准确的
    • 我没用过系统时间,一直用time.sleep(2)和loop
    • 可以分享一下页面吗?最好看看加载新内容时会发生什么。
    • 请检查小图表
    猜你喜欢
    • 2013-01-13
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多