每次在selenium python中更改时获取跨度文本(值)

2024-06-02 06:12:23 发布

您现在位置: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 code inspection

Web view of the span

webview of value2

Please I beg you, please beware Im not trying to print the text of the span, I already know how to do that, I want print it everytime it changes


Tags: ofthetotextidbyelementxpath
1条回答
网友
1楼 · 发布于 2024-06-02 06:12:23

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

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

假设元素内容发生变化,但不会消失:

我不知道有什么明确的方法来等待元素内容的更改,所以就我而言,您需要自己比较更改。您可能需要添加绝对等待时间<;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

请注意:只有当值每次都发生更改,或者不需要重复的值时,这才有效。 如果您需要每个值,可以省去比较,每隔约2秒添加一个值

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

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

由于这些步骤相当多,请查看屏幕截图,它将显示正确的设置: websocket in network tab in chrome

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

似乎您也可以使用selenium实现自动化,如下所示: http://www.amitrawat.tech/post/capturing-websocket-messages-using-selenium/

基本上他们做同样的事情,他们设置记录日志的功能,然后过滤日志以获得所需的数据。请注意,他们使用Java来实现这一点,但将其转换为python并不困难

相关问题 更多 >