Sunday, November 10, 2024

Get HTML of iframes in Microsoft Playwright

Playwright is a powerful framework for web testing and automation. This article demonstrates how to extract the HTML content of child IFRAMEs within a webpage using Python and Playwright.

Installation

To use Playwright in your Python project, you'll need to install it using pip:

pip install playwright
playwright install

Python Code

Here's the Python code:

import asyncio
from playwright.async_api import async_playwright, Frame

async def main():
  """
  This function retrieves the HTML content of each child iframe on a webpage.
  """
  async with async_playwright() as p:
    browser = await p.chromium.launch(headless=False)
    page = await browser.new_page()
    url = "https://interactive-examples.mdn.mozilla.net/pages/tabbed/iframe.html"
    await page.goto(url)

    # Wait for page to load and iframes to be rendered
    await page.wait_for_load_state("networkidle")

    for frame in page.frames:
      if not frame.url.startswith("http"):
        # May start with "about:"
        print(f'{frame.url}: Not a valid URL')
        continue
      if frame.url == url:
        print(f'{frame.url}: Skipping parent')
        continue
      print(f'{frame.url}: content below')
      print('*' * 80)
      content = await frame.content()
      print(content)
      print('*' * 80)

    await browser.close()

asyncio.run(main())

Wednesday, September 4, 2024

Snowflake SQL error: NULL result in a non-nullable column

Troubleshooting Snowflake SQL Error : NULL result in a non-nullable column

When working with Snowflake, you might encounter the error message:

SQL Error [100072] [22000]: NULL result in a non-nullable column

This error can be misleading at first glance. Let's walk through a common scenario that triggers this error and how to resolve it.

Scenario

Consider the following SQL script:

-- Create the test table
CREATE TABLE set_test (
    id INT NOT NULL,
    is_deleted CHAR(1) NOT NULL,
    foo FLOAT NULL
);

-- Insert a few records
INSERT INTO set_test (id, is_deleted, foo) VALUES
(1, 'F', 10.5),
(2, 'F', 20.0),
(3, 'F', 30.75);

-- Update one record to set is_deleted to 'T' and foo to NULL
UPDATE set_test
SET is_deleted = 'T' and foo = NULL
WHERE id = 2;

When you run the UPDATE statement, Snowflake returns the error message:

SQL Error [100072] [22000]: NULL result in a non-nullable column

Understanding the Error

The error message indicates that there is an attempt to insert a NULL value into a column that does not allow NULL values. However, in this case, the error is not due to the NULL value itself but rather a syntax issue in the UPDATE statement.

Resolving the Error

The issue lies in the UPDATE statement:

UPDATE set_test
SET is_deleted = 'T' and foo = NULL
WHERE id = 2;

In SQL, the SET clause should use commas to separate multiple column assignments, not the AND keyword. The correct UPDATE statement should be:

UPDATE set_test
SET is_deleted = 'T', foo = NULL
WHERE id = 2;

By replacing and with a comma, the UPDATE statement will execute without errors:

UPDATE set_test
SET is_deleted = 'T', foo = NULL
WHERE id = 2;

Conclusion

When you encounter the "NULL result in a non-nullable column" error in Snowflake, double-check the syntax of your UPDATE statement. Ensure that you are using commas to separate column assignments in the SET clause. This simple fix can save you time and prevent confusion when troubleshooting SQL errors.

If this does not help, see also Snowflake KB Inserting or loading data in table fails with error "NULL result in a non-nullable column".

Thursday, July 18, 2024

TP-Link Archer AX6000 vs MSI RadiX AXE6600 vs TP Link Deco P9

I had my TP Link Deco P9 (Wi-Fi 5 from 2019) system with three mesh nodes since 2020, but I was not thrilled with its performance. In 2022, I complained to TP Link support, but they did not help, so now I compared the Deco P9 to a MSI RadiX AXE6600 (Wi-Fi 6e from 2023) and TP-Link Archer AX6000 (Wi-Fi 6 from 2018). In 2020, I paid $250 for the Deco. In 2024, I bought the MSI used for $133.89 and the Archer for $63.49. Do not confuse the RadiX AXE6600 (Wi-Fi 6e) with AX6000 (Wi-FI 6): even Google Search mixes them up.

Attribute MSI RadiX AXE6600 TP-Link AX6000 TP-Link Deco P9
Brand MSI TP-Link TP-Link
Model RadiX AXE6600 AX6000 Deco P9
Paid Price $133.89 in 2024, Amazon used $63.49 in 2024, ebay $250.00 in 2020, new
Wi-Fi Generation 6E 6 5
Beamforming Yes Yes Yes
Streams 2/2/4 4/4/0 MU-MIMO
Antennas 6 8 2
2.5 Gbps LAN Ports 1 1 0 per unit
1 Gbps LAN Ports 4 8 2 per unit

For preformance testing, the Wi-Fi systems were set to AP mode and hard wired over 1 Gbps Ethernet to a Belkin RT3200 running OpenWRT, functioning as an iperf3 server to test LAN performance not confounded by an ISP. The MSI was set to 80 MHz on the 5 GHz band (the maximum) and 160 MHz on the 6 GHz band. The Archer was set to 80 MHz on the 5 GHz band. The Archer can do 160 MHz, though the setting was hard to find, and in other testing, it did not make a big difference at close range.

With iperf3 in default mode, the client sends (i.e., uploads): I call this forward mode. In reverse mode, the client receives (i.e., downloads). I used the PingTools Android app for iperf3 and PingMon app for ICMP ping.

The network client was usually a Samsung Galaxy S24 (Wi-Fi 6e) smartphone, but a few tests were done with a Galaxy A15 (Wi-Fi 5), which is a much cheaper phone.

Performance at close range

I began by testing at close range, which represents the ideal scenario for Wi-Fi. In this test, the Deco P9 was a satellite hard-wired to the primary Deco.

Here the MSI RadiX AXE6600 outperformed the others on the 5 GHz band, and as you would expect, the MSI performance on the 6 GHz band was even better than the MSI on 5 GHz.

Strangely, the cheaper Galaxy A15 had much better latency than the Galaxy S24, though the Galaxy S24 performed better than the Galaxy A15 on bandwidth tests, which is expected because the Galaxy S24 supports a newer generation of Wi-Fi.

Access Point Band Client Ping avg ms iperf forward Mbps< iperf reverse Mbps
MSI RadiX AXE6600 6 GHz Galaxy S24 16 777 909
MSI RadiX AXE6600 5 GHz Galaxy S24 18 578 716
TP-Link Archer AX6000 5 GHz Galaxy S24 17 617 760
MSI RadiX AXE6600 5 GHz Galaxy a15 3 314 338
TP-Link Archer AX6000 5 GHz Galaxy a15 4 334 312
Deco P9 5 GHz Galaxy a15 4 277 289
Deco P9 5 GHz Galaxy S24 16 307 472

Indoors, far away

Next, I tested with the phones in a part of the house with poor network coverage. I limited testing to 5 GHz because this location has a desktop computer that uses only 5 GHz.

In a reversal from the close-range testing, the TP-Link Archer outperformed the other access points.

Access Point Band Ping Avg MS Iperf Forward (Mbps) Iperf Reverse (Mbps)
MSI RadiX AXE6600 6 GHz 27 78 199
MSI RadiX AXE6600 5 GHz 37 30 34
TP-Link Archer AX6000 5 GHz 18 94 318
TP-Link Deco P9 5 GHz 19 41 70

Outdoor

My final test was outdoors where I use a 2.4 GHz camera and 5 GHz phones, so I tested all bands.

I was surprised the 6 GHz worked outside, and it was still fast. The Archer outperformed the other APs on the 2.4 GHz band, and like in the last test, also on the 5 GHz band.

Access Point Band Ping Avg MS iperf Forward (Mbps) iperf Reverse (Mbps)
MSI RadiX AXE6600 6 GHz 261 558
MSI RadiX AXE6600 5 GHz 67 38 228
TP-Link Archer AX6000 5 GHz 20 303 431
MSI RadiX AXE6600 2.4 GHz 36 6 21
TP-Link Archer AX6000 2.4 GHz 38 28 22
TP-Link Deco P9 2.4 GHz 37 8 17

Other thoughts

The MSI RadiX AXE6600 has a good web interface for viewing system information and changing settings, but the MSI app never logged in for me. When my netmask was 255.0.0.0 the MSI would go into a loop, using all memory, and invoking the OOM killer, so I changed the netmask as a workaround. The MSI made 172800 DNS queries per day, which is excessive.

The Archer's Tether app is spartan with little information and few settings. The Archer has much more info and settings available through its web interface than the Tether app. While the Deco app is the better than Tether, I was annoyed by the slow refresh rates and the lack of a time series display for the network usage.

The MSI 6 GHz band performed well outside and throughout the house, so it makes a credible use case as a high-performance backhaul for Wi-Fi 6e mesh systems.

Achieving gigabit performance on these Wi-Fi systems was rare, so it makes a case against paying for high speed ISPs faster than gigabit. Devices like the Galaxy A13 could not even use half of a gigabit Internet plan.

Conclusion

Despite its age, I decided to keep the TP-Link Archer and sell the Deco P9 and MSI RadiX because the Archer performed best throughout the house and outdoors. It was a surprise that a single device, the Archer, could outperform the three units of the Deco's mesh system, and the Archer was also the oldest, outperforming the newest, which was the MSI. For me, consistent performance across my house and outdoors was more important than fastest speeds at close range. I discounted performance on the 6 GHz band (MSI) because few of my devices have a 6 GHz band: many of my devices are IoT devices that support only 2.4 GHz, while other devices are Wi-Fi 4 and Wi-Fi 5 on 5 GHz. The Archer has more than enough bandwidth to support my DSL ISP.

Wednesday, February 14, 2024

I bought a dashcam from Temu for $6.31 January 2024, and here is sample footage that includes three scenes: daytime, dusk, and daytime.

Product benefits

  • Easy mounting with suction cup
  • Easy power with 12V cigarette plug adapter
  • Battery lasts a few moments after car turns off
  • MicroSD card included
  • Cheap price

Problems

  • Cheap quality
  • Terrible video quality (despite product description)
  • Narrow field of view (despite product description)

Notes

  • It was a weird choice for it record in .avi instead of .mp4 container.
  • The product was discontinued on Temu.

Model (box): Y320
Manufacturer (box): shenzhen Hengxin Weiye Digital Co., LTD
Product title (Temu):
Dash Camera For Cars With 32G Memory Cards Wide Angle Full 1080P Driving Record...

Below is the product menu (PDF on Temu):
Intelligent voice reminder, built-in multinational voice pronunciation, no need to worry about language barriers 1080P highdefinition night vision, even in the weak light environment, can also shoot clearly Loop recording, no missing seconds, segmented storage, automatic monitoring of sto rage space, when the memory is full, automatically delete the earliest recorded video and save the new video Builtin gravity sensor, when a sudden brake or collision is sensed, the current video is instantly locked to prevent overwriting important files during loop recording Supported languages: English, French, German, Russian, Japanese, etc.

Get HTML of iframes in Microsoft Playwright

Playwright is a powerful framework for web testing and automation. This article demonstrates how to extract the HTML content of child IFRAME...