NỘI DUNG BÀI HỌC
✅ Hiểu rõ chuỗi (string) là gì và các đặc tính cơ bản của nó trong Python.
✅ Sử dụng thành thạo các hàm và phương thức cơ bản: len()
, upper()
, lower()
, strip()
.
✅ Nắm vững kỹ thuật cắt chuỗi (slicing) để trích xuất thông tin cần thiết.
✅ Biết cách tách chuỗi thành danh sách (split()
) và nối danh sách thành chuỗi (join()
).
✅ Vận dụng replace()
để thay thế nội dung trong chuỗi.
✅ Sử dụng toán tử in
để kiểm tra sự tồn tại của một chuỗi con.
✅ Áp dụng kiến thức xử lý chuỗi vào các bài toán thực tế trong test automation.
1. String trong Python là gì?
Trong các buổi trước, chúng ta đã làm quen với các kiểu dữ liệu như số nguyên, số thực. Hôm nay, chúng ta sẽ tìm hiểu sâu về một trong những kiểu dữ liệu được sử dụng nhiều nhất: chuỗi (string).
Hiểu đơn giản, chuỗi là một tập hợp các ký tự được đặt trong dấu nháy đơn ('
) hoặc nháy kép ("
). Ký tự có thể là chữ cái, số, dấu câu, khoảng trắng, và cả các ký tự đặc biệt.
🔹 Ví dụ trong cuộc sống:
-
Tên của bạn:
"Nguyễn Văn A"
-
Địa chỉ email:
"tester.01@company.com"
-
Một dòng log lỗi:
"ERROR: User not found in database."
-
Nội dung một tweet:
"Học automation test thật vui! #python #automation"
# Ví dụ về các chuỗi hợp lệ trong code greeting = "Hello, World!" user_name = 'automation_tester_01' error_message = "Lỗi: Tên đăng nhập không được chứa ký tự đặc biệt." product_id = "SKU-12345" json_data = '{"id": 1, "name": "Laptop"}'
Đặc tính quan trọng: Chuỗi trong Python là bất biến (immutable). Điều này có nghĩa là bạn không thể thay đổi một phần của chuỗi sau khi đã tạo ra nó. Các thao tác như replace()
hay upper()
sẽ tạo ra một chuỗi mới từ chuỗi ban đầu, chứ không thay đổi chuỗi gốc.
# Chuỗi gốc không hề thay đổi
original_text = "hello world"
upper_text = original_text.upper()
print("Chuỗi gốc:", original_text) # Kết quả: hello world
print("Chuỗi mới:", upper_text) # Kết quả: HELLO WORLD
2. Các hàm và phương thức cơ bản
Đây là những công cụ đầu tiên bạn cần nắm để làm việc với chuỗi.
2.1 Lấy độ dài chuỗi - len()
Hàm len()
trả về số lượng ký tự có trong chuỗi (bao gồm cả khoảng trắng).
Hàm len()
trả về số lượng ký tự có trong chuỗi (bao gồm cả khoảng trắng và các ký tự đặc biệt).
🔹 Tình huống thực tế: Một diễn đàn quy định tên người dùng phải có từ 6 đến 20 ký tự.
username = "tester_pro_123"
length = len(username)
print(f"Độ dài của tên người dùng là: {length}") # Kết quả: 16
if 6 <= length <= 20:
print("Tên người dùng hợp lệ.")
else:
print("Tên người dùng phải có từ 6 đến 20 ký tự.")
Một ứng dụng mạng xã hội giới hạn độ dài của một bài đăng là 280 ký tự.
post_content = "Hôm nay là một ngày đẹp trời để học về xử lý chuỗi trong Python!"
if len(post_content) > 280:
print("Lỗi: Bài đăng đã vượt quá 280 ký tự.")
else:
print("Bài đăng hợp lệ.")
🔹 Ứng dụng trong Automation: Kiểm tra xem một phần tử trên web (ví dụ: thông báo lỗi) có hiển thị text hay không. Nếu độ dài > 0, tức là có text.
# Automation: Kiểm tra message lỗi có tồn tại
error_msg_from_web = "Tài khoản không tồn tại."
if len(error_msg_from_web) > 0:
print("✅ TEST PASSED: Thông báo lỗi đã hiển thị.")
else:
print("❌ TEST FAILED: Không tìm thấy thông báo lỗi.")
2.2 Chuyển đổi chữ hoa / chữ thường - upper()
& lower()
-
.upper()
: CHUYỂN TẤT CẢ THÀNH CHỮ HOA. -
.lower()
: chuyển tất cả thành chữ thường. -
.capitalize()
: Viết hoa chữ cái đầu tiên của chuỗi. -
.title()
: Viết Hoa Chữ Cái Đầu Của Mỗi Từ.
🔹 Ví dụ trong cuộc sống: Chuẩn hóa họ tên người dùng nhập vào.
#Chuyển tất cả ký tự thành chữ hoa.
text = "hello world"
print(text.upper())
# HELLO WORLD
#Chuyển tất cả ký tự thành chữ thường.
text = "HELLO WORLD"
print(text.lower())
# hello world
#Người dùng nhập tên toàn chữ thường → muốn hiển thị chuẩn:
name = "lan ha"
print(name.capitalize()) # Lan ha
# Chuẩn hóa tên
raw_name = "nGuyễn vĂn A"
proper_name = raw_name.title()
print(proper_name) # Kết quả: Nguyễn Văn A
🔹 Ứng dụng trong Automation: So sánh dữ liệu không phân biệt chữ hoa/thường.
# Ví dụ
db_value = "Success"
ui_message = "success" # So sánh thông thường sẽ thất bại
if db_value == ui_message:
print("Hai chuỗi giống hệt nhau.")
else:
print("Hai chuỗi khác nhau.") # Sẽ in ra dòng này
# So sánh không phân biệt hoa/thường
if db_value.lower() == ui_message.lower():
print("✅ TEST PASSED: Nội dung thông báo khớp.")
else:
print("❌ TEST FAILED: Nội dung thông báo không khớp.")
# So sánh message login trả về từ API (không phân biệt hoa/thường).
expected = "LOGIN SUCCESS"
actual = "login success"
if expected == actual.upper():
print("✅ Test Passed")
Bảng so sánh capitalize(), upper(), lower() và title():
Hàm | Mô tả | Ví dụ Python | Kết quả | Ứng dụng Thực tế | Ứng dụng Automation |
capitalize() | Viết hoa chữ cái đầu tiên của chuỗi, các chữ còn lại thành thường | "hello world".capitalize() | "Hello world" | Hiển thị tên người nhập sai format "lan ha" → "Lan ha" | Normalize input trước khi so sánh: "lan" → "Lan" |
upper() | Chuyển toàn bộ chuỗi thành chữ hoa | "hello world".upper() | "HELLO WORLD" | Lưu trữ biển số xe chuẩn dạng hoa "51h-12345" → "51H-12345" | So sánh message không phân biệt hoa/thường: "login success" → "LOGIN SUCCESS" |
lower() | Chuyển toàn bộ chuỗi thành chữ thường | "HELLO WORLD".lower() | "hello world" | Chuẩn hóa email để tìm kiếm "User@GMAIL.com" → "user@gmail.com" | Validate email API response: "USER@GMAIL.COM" → "user@gmail.com" |
title() | Viết hoa chữ cái đầu tiên của mỗi từ | "hello world from python".title() | "Hello World From Python" | Hiển thị tên sách "harry potter..." → "Harry Potter..." | Validate form nhập họ tên "nguyen van a" → "Nguyen Van A" |
2.3 Loại bỏ khoảng trắng thừa - strip()
, lstrip()
, rstrip()
Đây là công cụ cực kỳ hữu ích để "làm sạch" dữ liệu. Loại bỏ các khoảng trắng, tab (\t
), hoặc ký tự xuống dòng (\n
) ở hai đầu chuỗi.
-
ten_chuoi.strip()
: Loại bỏ khoảng trắng ở cả hai đầu chuỗi. -
ten_chuoi.lstrip()
: Loại bỏ khoảng trắng ở đầu bên trái. -
ten_chuoi.rstrip()
: Loại bỏ khoảng trắng ở đầu bên phải.
2.3.1 strip()
👉 Xóa khoảng trắng (hoặc ký tự chỉ định) ở cả hai đầu chuỗi.
🔹 Ví dụ đời sống
Người dùng nhập mật khẩu nhưng vô tình thêm khoảng trắng ở đầu/cuối:
➡️ Thực tế: nhiều người copy–paste mật khẩu thường bị lỗi do khoảng trắng ẩn.
🔹 Ví dụ automation
So sánh text lấy từ UI:
expected = "Login Successful"
actual = " Login Successful "
if expected == actual.strip():
print("✅ Test Passed")
➡️ Nếu không dùng strip()
thì test sẽ fail vì " Login Successful " ≠ "Login Successful"
.
2.3.2 lstrip()
👉 Xóa khoảng trắng (hoặc ký tự chỉ định) ở bên trái (đầu chuỗi).
🔹 Ví dụ đời sống
Danh sách số điện thoại bị thừa khoảng trắng ở đầu:
➡️ Thực tế: Khi người dùng nhập số điện thoại trên web/app.
🔹 Ví dụ automation
Xử lý dữ liệu log file có thụt đầu dòng:
log = " ERROR: Connection failed"
print(log.lstrip())
# "ERROR: Connection failed"
➡️ Giúp dễ dàng parse log chính xác.
2.3.3 rstrip()
👉 Xóa khoảng trắng (hoặc ký tự chỉ định) ở bên phải (cuối chuỗi).
🔹 Ví dụ đời sống
Tên file khi export bị thừa khoảng trắng ở cuối:
filename = "report_2025 "
print(filename.rstrip())
# "report_2025"
➡️ Nếu không xử lý, khi lưu file "report_2025 .txt"
sẽ lỗi.
🔹 Ví dụ automation
API response trả về chuỗi "Success "
:
response = "Success "
if response.rstrip() == "Success":
print("✅ Test Passed")
➡️ Nếu không rstrip()
, test case sẽ fail.
price_from_web = " \n 25,000 đ \n "
cleaned_price = price_from_web.strip()
expected_price = "25,000 đ"
if cleaned_price == expected_price:
print(f"✅ PASSED: Giá sản phẩm hiển thị đúng là '{cleaned_price}'.")
Bảng so sánh strip(), lstrip(), rstrip() trong Python
Hàm | Mô tả | Ví dụ đầu vào | Kết quả | Ứng dụng thực tế | Ứng dụng automation |
strip() | Xóa cả 2 bên | " Hello " | "Hello" | Xử lý mật khẩu copy-paste | So sánh text UI/API |
lstrip() | Xóa bên trái | " Hello" | "Hello" | Chuẩn hóa số điện thoại | Parse log file |
rstrip() | Xóa bên phải | "Hello " | "Hello" | Chuẩn hóa tên file | So sánh API response |
3. Cắt chuỗi (Slicing)
Slicing là kỹ thuật cho phép bạn "cắt" ra một phần của chuỗi để lấy chuỗi con mà bạn muốn. Nó hoạt động dựa trên chỉ số (index) của ký tự.
Lưu ý: Chỉ số trong Python bắt đầu từ 0.
Cú pháp: ten_chuoi[start:stop:step]
-
start
: Chỉ số bắt đầu (bao gồm). Nếu bỏ trống, mặc định là 0. -
stop
: Chỉ số kết thúc (không bao gồm). Nếu bỏ trống, mặc định là đến hết chuỗi. -
step
: Bước nhảy (mặc định là 1).
text = "Automation Testing"
# 0123456789...
# Lấy từ "Automation"
print(text[0:10]) # Kết quả: 'Automation'
print(text[:10]) # Cách viết tắt, tương tự như trên
# Lấy từ "Testing"
print(text[11:18]) # Kết quả: 'Testing'
print(text[11:]) # Cách viết tắt
# Lấy ký tự cuối cùng
print(text[-1]) # Kết quả: 'g'
# Đảo ngược chuỗi (một mẹo hay)
print(text[::-1]) # Kết quả: 'gnitseT noitamotuA'
🔹 Ví dụ trong cuộc sống: Lấy mã vùng từ một số điện thoại. ví dụ (+84901234567)
.
phone_number = "+84901234567"
area_code = phone_number[:3] # Lấy 3 ký tự đầu tiên
print(f"Mã vùng: {area_code}") # Kết quả: +84
🔹 Ứng dụng trong Automation: Trích xuất một mã đơn hàng, ID người dùng, hoặc một thông tin cụ thể từ một chuỗi dài.
# Giả sử thông báo trên web là "Đơn hàng #DH-98765 đã được tạo thành công."
success_message ="Đơn hàng #DH-98765 đã được tạo thành công."
start_pos = success_message.find("#")
order_id = success_message[start_pos : start_pos + 9]
print(f"Đã trích xuất mã đơn hàng: {order_id}") # Kết quả: #DH-98765
# Lấy session ID từ URL
url = "[https://example.com/dashboard?session_id=abc123xyz&user=test](https://example.com/dashboard?session_id=abc123xyz&user=test)"
session_start = url.find("session_id=") + len("session_id=")
session_end = url.find("&", session_start)
session_id = url[session_start:session_end]
print(f"Session ID là: {session_id}") # Kết quả: abc123xyz
4. Các phương thức xử lý mạnh mẽ
Phương thức split()
dùng để chặt một chuỗi thành một danh sách (list) các chuỗi con, dựa trên một ký tự phân tách (delimiter).
4.1 split()
- Tách chuỗi
Phương thức split()
dùng để chặt một chuỗi thành một danh sách (list) các chuỗi con, dựa trên một ký tự phân tách. Nếu không chỉ định ký tự, nó sẽ tách theo khoảng trắng.
🔹 Ví dụ trong cuộc sống: Tách danh sách các sở thích được nhập cách nhau bởi dấu phẩy.
hobbies_str = "đá bóng, đọc sách, nghe nhạc"
hobbies_list = hobbies_str.split(', ')
print(hobbies_list) # Kết quả: ['đá bóng', 'đọc sách', 'nghe nhạc']
🔹 Ứng dụng trong Automation: Tách các class CSS của một element để kiểm tra xem một class cụ thể có tồn tại không.
# Tách câu thành các từ
sentence = "Automation testing is fun"
words = sentence.split()
print(words) # ['Automation', 'testing', 'is', 'fun']
# Automation: Kiểm tra class 'active'
element_classes = "btn btn-primary active"
class_list = element_classes.split()
if "active" in class_list:
print("✅ TEST PASSED: Element đang ở trạng thái active.")
# Log file ghi nhiều dòng bằng \n:
#➡️ Automation test có thể phân tích từng dòng log để kiểm tra lỗi.
logs = "INFO: Start\nERROR: Timeout\nINFO: End"
print(logs.split("\n"))
# ['INFO: Start', 'ERROR: Timeout', 'INFO: End']
4.2 join()
- Nối chuỗi
join()
là thao tác ngược lại với split()
. Nó nối các phần tử của một list (hoặc tuple...) lại thành một chuỗi duy nhất, với một ký tự nối do bạn chỉ định.
Cú pháp hơi lạ một chút: ky_tu_noi.join(list_can_noi)
🔹 Tình huống thực tế: Tạo một dòng dữ liệu CSV từ một list các giá trị.
user_info = ["tester01", "tester@email.com", "Hanoi"]
csv_line = ",".join(user_info)
print(csv_line) # Kết quả: "tester01,tester@email.com,Hanoi"
🔹 Ứng dụng trong Automation: Xây dựng một Xpath động từ một list các điều kiện.
# Tạo dòng CSV
data = ["SP001", "Laptop ABC", "15000000"]
csv_row = ",".join(data)
print(csv_row) # Kết quả: SP001,Laptop ABC,15000000
# Tạo Xpath động
conditions = ["@type='button'", "@name='login'", "contains(text(),'Đăng nhập')"]
xpath = f"//button[{' and '.join(conditions)}]"
print(xpath) # //button[@type='button' and @name='login' and contains(text(),'Đăng nhập')]
4.3 replace()
- Thay thế chuỗi
Phương thức này tìm và thay thế một chuỗi con bằng một chuỗi con khác.
ten_chuoi.replace(chuoi_cu, chuoi_moi, count)
tìm và thay thế chuoi_cu
bằng chuoi_moi
. Tham số count
(tùy chọn) giới hạn số lần thay thế.
🔹 Tình huống thực tế: Chuẩn hóa số điện thoại: thay dấu -
thành khoảng trắng.
phone = "0987-123-456"
print(phone.replace("-", " "))
# "0987 123 456"
🔹 Ứng dụng trong Automation: Chuẩn hóa dữ liệu số trước khi so sánh, hoặc tạo dữ liệu test động.
# API trả về text có ký tự thừa:
response = "Login SUCCESS!!!"
print(response.replace("!!!", ""))
# "Login SUCCESS"
# Chuẩn hóa đường dẫn file:
path = "C:\\Users\\Lan\\Documents"
print(path.replace("\\", "/"))
# "C:/Users/Lan/Documents"
# Chuẩn hóa giá tiền
price_text = "1,550,000 đ"
price_cleaned = price_text.replace(",", "").replace(" đ", "")
price_value = int(price_cleaned)
print(f"Giá trị số: {price_value}") # 1550000
Bảng tóm tắt so sánh split(), join(), replace()
Bảng tóm tắt so sánh split(), join(), replace()
Hàm | Chức năng | Ví dụ | Ứng dụng thực tế | Ứng dụng automation | Ứng dụng automation |
split() | Tách chuỗi thành list | "a,b,c".split(",") → ['a','b','c'] | Tách nhiều số điện thoại nhập trong 1 ô | Tách log file theo dòng | So sánh text UI/API |
join() | Ghép list thành chuỗi | " ".join(['a','b']) → "a b" | Ghép tên trong danh sách | Ghép error message trong báo cáo | Parse log file |
5. Kiểm tra sự tồn tại của chuỗi con (in
)
Để kiểm tra xem một chuỗi có chứa một chuỗi con khác hay không, ta dùng toán tử in
. Kết quả trả về là True
hoặc False
. Đây là cách kiểm tra linh hoạt và mạnh mẽ hơn so với so sánh bằng ==
.
Ngoài in
, chúng ta còn có các phương thức hữu ích khác.
-
in
: Kiểm tra chuỗi con có ở bất kỳ đâu trong chuỗi lớn. -
ten_chuoi.startswith(chuoi_con)
: Kiểm tra chuỗi có bắt đầu bằngchuoi_con
không. -
ten_chuoi.endswith(chuoi_con)
: Kiểm tra chuỗi có kết thúc bằngchuoi_con
không.
🔹 Tình huống thực tế:
# Người dùng nhập email, cần kiểm tra có chứa ký tự @:
email = "usergmail.com"
checkEmail = "@"
if checkEmail in email:
print("Correct format!")
else:
print("Invalid format!")
# False
# Kiểm tra một file có phải là file ảnh hay không (.jpg, .png).
file_name = "report_2023.pdf"
error_code = "ERR_NETWORK_FAILURE"
if file_name.endswith(".pdf"):
print("Đây là một file PDF.")
if error_code.startswith("ERR_"):
print("Đây là một mã lỗi hệ thống.")
🔹 Ứng dụng trong Automation: Xác thực URL, mã lỗi, hoặc định dạng của một giá trị nào đó. Thay vì kiểm tra toàn bộ một câu thông báo lỗi (có thể thay đổi), ta chỉ cần kiểm tra sự hiện diện của một từ khóa quan trọng.
# Automation: Kiểm tra URL sau khi click
current_url = "[https://example.com/checkout/success](https://example.com/checkout/success)"
if "/checkout/success" in current_url:
print("✅ TEST PASSED: Đã chuyển hướng đến trang thành công.")
# Kiểm tra từ khóa trong thông báo lỗi
error_message = "Tài khoản của bạn đã bị khóa tạm thời."
if "khóa" in error_message:
print("✅ TEST PASSED: Thông báo lỗi có chứa từ khóa 'khóa'.") #
# Kiểm tra tên sản phẩm có đúng từ khóa tìm kiếm không search_keyword = "MacBook Pro"
search_result_title = "Apple MacBook Pro M3 16-inch 2023"
if search_keyword.lower() in search_result_title.lower():
print(f"✅ TEST PASSED: Tiêu đề sản phẩm chứa từ khóa '{search_keyword}'.")
Mini Quiz
Câu hỏi: Đoạn mã 'Hello'.upper()
sẽ trả về kết quả gì?
-
A. hello
-
B. HELLO
-
C. Hello
-
D. Gây ra lỗi
6. Bài tập
-
Trích xuất tên người dùng: Cho một địa chỉ email
user_email = "automation.tester01@g-mail.com"
. Viết code để lấy ra phần tên người dùng (username) là"automation.tester01"
. -
Chuẩn hóa số điện thoại: Một SĐT được nhập vào có dạng
messy_phone = " 090-123 4567 "
. Hãy viết code để chuẩn hóa SĐT này về dạng0901234567
(loại bỏ hết khoảng trắng và gạch nối). -
Tạo slug URL: "Slug" là phiên bản rút gọn của tiêu đề, dùng cho URL. Ví dụ, tiêu đề
"Top 5 Laptop Gaming Đáng Mua Nhất"
sẽ có slug là"top-5-laptop-gaming-dang-mua-nhat"
. Hãy viết code để chuyển đổi một tiêu đề bất kỳ thành slug theo quy tắc:-
Chuyển hết về chữ thường.
-
Thay thế tất cả khoảng trắng bằng dấu gạch ngang (
-
).
-
7. Tóm tắt buổi học
-
Chuỗi (string) là một chuỗi các ký tự, có tính chất bất biến (immutable).
-
len()
: Đếm số ký tự. -
.lower()
,.upper()
: Thay đổi hoa/thường, rất quan trọng khi so sánh. -
.strip()
: "Làm sạch" khoảng trắng thừa ở 2 đầu. -
Slicing
[start:stop]
: Công cụ mạnh mẽ để trích xuất chuỗi con. -
.split()
: Tách chuỗi thànhlist
. -
.join()
: Nốilist
thành chuỗi. -
.replace()
: Thay thế một phần của chuỗi. -
Toán tử
in
: Kiểm tra sự tồn tại của chuỗi con một cách linh hoạt.