首页 > 解决方案 > 每次在 selenium python 中更改时获取跨度文本(值)

问题描述

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

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 代码检查

跨度的 Web 视图

价值网络视图2

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

标签: pythonhtmlseleniumtext

解决方案


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

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

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

我不知道等待元素内容更改的任何显式方法,因此就我而言,您需要自己比较更改。您可能希望添加 < 2 秒的绝对等待,以限制您进行的不必要比较的数量。

# 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 中获得输出)。单击该连接,您将看到您的客户发送的消息和您收到的消息。自然,您只需要收到的那些,因此请过滤掉那些。

由于这些步骤相当多,请查看该屏幕截图,它显示了正确的设置: chrome中网络选项卡中的websocket

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

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

基本上他们做同样的事情,他们设置记录日志的能力,然后过滤它以获得他们需要的数据。请注意,他们使用 Java 来做到这一点——但翻译成 python 并不难。


推荐阅读