NỘI DUNG BÀI HỌC

✅ Hiểu và viết được cấu trúc rẽ nhánh if, else, elif để xử lý các điều kiện khác nhau.
✅ Nắm vững khái niệm và cú pháp của vòng lặp for để duyệt qua các chuỗi, list, tuple...
✅ Sử dụng thành thạo hàm range() kết hợp với vòng lặp for.
✅ Hiểu và viết được vòng lặp while dựa trên một điều kiện cho trước.
✅ Phân biệt được khi nào nên dùng for và khi nào nên dùng while.
✅ Biết cách sử dụng breakcontinue

1. Cấu trúc điều kiện (If, Else, Elif)

Trong cuộc sống, chúng ta luôn phải đưa ra quyết định dựa trên các điều kiện. Ví dụ: "Nếu trời mưa, tôi sẽ mang ô".

Trong lập trình, cấu trúc điều kiện (hay còn gọi là rẽ nhánh) cho phép máy tính làm điều tương tự: thực thi những đoạn mã khác nhau tùy thuộc vào một điều kiện cụ thể là đúng (True) hay sai (False). Nó giống như chỉ đường cho chương trình tại một ngã rẽ.

Chúng ta sẽ tìm hiểu 3 từ khóa chính để xây dựng nên cấu trúc này: if, else, và elif.


1.1 Lệnh if - Điều kiện đơn

Lệnh if là dạng cơ bản nhất. Nó dùng để kiểm tra một điều kiện. Nếu điều kiện đó đúng (True), khối lệnh bên trong if sẽ được thực thi. Nếu điều kiện sai (False), chương trình sẽ bỏ qua khối lệnh đó và đi tiếp.

🔹 Tình huống thực tế: "Nếu bạn thấy đèn đỏ, thì bạn dừng lại". Lệnh này chỉ nói phải làm gì khi thấy đèn đỏ, không đề cập đến trường hợp đèn xanh hay vàng.

Cú pháp
if dieu_kien:
    # Khối lệnh sẽ được thực thi nếu dieu_kien là True

Ví dụ

Hãy viết chương trình kiểm tra xem một người có đủ tuổi để xem phim Mai của Trấn Thành hay không.

age = 20

if age >= 18:
    print("Bạn đã đủ tuổi. Chúc bạn xem phim vui vẻ!")

# Nếu bạn đổi age = 15, chương trình sẽ không in ra gì cả.


Ứng dụng trong Automation

Kiểm tra xem một pop-up quảng cáo có xuất hiện trên trang web hay không. Nếu có, hãy click để tắt nó đi.

# Giả sử is_popup_visible là biến kiểm tra sự hiện diện của pop-up
is_popup_visible = True

if is_popup_visible:
    print("Phát hiện có pop-up quảng cáo. Đang thực hiện đóng...")
    # code_để_click_nút_đóng()


1.2 Lệnh if-else - Lựa chọn 1 trong 2

Cấu trúc if-else đưa ra hai lựa chọn: một cho trường hợp điều kiện đúng, và một cho tất cả các trường hợp còn lại (khi điều kiện sai).

🔹 Tình huống thực tế: "Nếu trời mưa, thì mang ô. Ngược lại (trời không mưa), thì đội mũ". Ở đây luôn có một hành động được thực hiện.

Cú pháp

if dieu_kien:
    # Thực thi nếu dieu_kien là True
else:
    # Thực thi nếu dieu_kien là False


Ví dụ

Kiểm tra một số là chẵn hay lẻ. Một số hoặc là chẵn, hoặc là lẻ, không có trường hợp khác.

number = 7

if number % 2 == 0:
    print(f"Số {number} là số chẵn.")
else:
    print(f"Số {number} là số lẻ.")
 

Ứng dụng trong Automation

Sau khi đăng nhập, kiểm tra xem thông báo thành công có xuất hiện không để quyết định test case Pass hay Fail.

# Giả sử login_message là dòng chữ ta lấy được sau khi login
login_message = "Tài khoản hoặc mật khẩu không chính xác."

if login_message == "Đăng nhập thành công!":
    print("✅ TEST PASSED: Chức năng đăng nhập hoạt động đúng.")
else:
    print("❌ TEST FAILED: Đăng nhập thất bại hoặc thông báo lỗi không đúng.")


1.3 Lệnh if-elif-else - Khi có nhiều hơn 2 lựa chọn

Khi chúng ta có nhiều điều kiện cần kiểm tra, if-elif-else là công cụ hoàn hảo. elif là viết tắt của "else if". Chương trình sẽ kiểm tra các điều kiện từ trên xuống dưới:

  1. Kiểm tra if. Nếu đúng, thực thi và kết thúc.

  2. Nếu if sai, kiểm tra elif đầu tiên. Nếu đúng, thực thi và kết thúc.

  3. Cứ tiếp tục như vậy cho đến hết các elif.

  4. Nếu tất cả ifelif đều sai, khối lệnh của else sẽ được thực thi.

🔹 Tình huống thực tế: Đèn giao thông.

  • Nếu đèn đỏ, thì dừng lại.

  • Ngược lại nếu đèn vàng, thì đi chậm lại.

  • Trường hợp còn lại (đèn xanh), thì được đi.

Cú pháp

if dieu_kien_1:
    # Thực thi nếu dieu_kien_1 là True
elif dieu_kien_2:
    # Thực thi nếu dieu_kien_1 là False VÀ dieu_kien_2 là True
else:
    # Thực thi nếu tất cả các điều kiện trên đều False


Ví dụ

Xếp loại học lực dựa trên điểm trung bình.

diem_tb = 7.5

if diem_tb >= 8:
    print("Học lực: Giỏi")
elif diem_tb >= 6.5:
    print("Học lực: Khá")
elif diem_tb >= 5:
    print("Học lực: Trung bình")
else:
    print("Học lực: Yếu")


Ứng dụng trong Automation

Kiểm tra mã trạng thái (status code) của một API response để có những hành động tương ứng.

# Giả sử response_code là mã trạng thái nhận được từ API
response_code = 404

if response_code == 200:
    print("API call thành công (OK). Bắt đầu xử lý dữ liệu...")
elif response_code == 404:
    print("Lỗi: Không tìm thấy tài nguyên (Not Found).")
elif response_code == 403:
    print("Lỗi: Không có quyền truy cập (Forbidden).")
elif response_code == 500:
    print("Lỗi: Máy chủ gặp sự cố (Internal Server Error).")
else:
    print(f"Lỗi không xác định với mã: {response_code}")​

⚠️ Lỗi thường gặp & cách sửa

  • Lỗi thụt lề (IndentationError): Quên không thụt lề code bên trong if/else.

    # Lỗi
    if age > 18:
    print("Lỗi!")

    Sửa: Thêm thụt lề (4 dấu cách).

    # Đúng
    if age > 18:
        print("Đúng!")​
  • Dùng = thay vì ==: Dấu = là phép gán, == mới là phép so sánh bằng.

    # Lỗi
    if message = "Success":
        print("Lỗi cú pháp!")

    Sửa: Dùng == để so sánh.

    # Đúng
    if message == "Success":
        print("Đúng!")
  • Quên dấu hai chấm (:) ở cuối dòng if, elif, else.


2. Vòng lặp for

Khái niệm

Vòng lặp for được sử dụng khi bạn muốn lặp qua một chuỗi các phần tử (ví dụ: một list, tuple, string, set, dict) và thực hiện một hành động cho từng phần tử.

Nó giống như việc bạn có một danh sách các việc cần làm, và bạn đi qua từng việc một từ đầu đến cuối danh sách.


Cú pháp và ví dụ

# Lặp qua một List
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print("Tôi thích ăn", fruit)

# Lặp qua một chuỗi (String)
for char in "Python":
    print(char)

# Lặp qua một Dictionary (lấy key)
student = {"name": "Lan", "age": 25}
for key in student:
    print(key, "->", student[key])


Hàm range()

range() là một hàm rất hữu ích, thường đi kèm với for để tạo ra một dãy số.

  • range(stop): Tạo dãy số từ 0 đến stop - 1.

  • range(start, stop): Tạo dãy số từ start đến stop - 1.

  • range(start, stop, step): Tạo dãy số từ start đến stop - 1, với mỗi bước nhảy là step.

 
# In các số từ 0 đến 4
for i in range(5):
    print(i) # 0, 1, 2, 3, 4

# In các số chẵn từ 2 đến 10
for i in range(2, 11, 2):
    print(i) # 2, 4, 6, 8, 10


Ứng dụng thực tế trong Automation

  • Data-Driven Testing: Kiểm thử chức năng đăng nhập với nhiều bộ dữ liệu (username, password).

    # List các cặp (username, password)
    credentials = [
        ("user1", "pass1"),
        ("user2", "pass2"),
        ("invalid_user", "wrong_pass")
    ]
    
    for username, password in credentials:
        print(f"Testing login with: {username} / {password}")
        # (Code automation để điền username, password và click login)
  • Duyệt qua tất cả các sản phẩm trên trang tìm kiếm: Lấy tên và giá của từng sản phẩm.

    # Giả sử `products` là một list các phần tử web của sản phẩm
    # products = driver.find_elements(By.CSS_SELECTOR, ".product-item")
    
    # for product_element in products:
    #     name = product_element.find_element(By.CSS_SELECTOR, ".product-name").text
    #     price = product_element.find_element(By.CSS_SELECTOR, ".product-price").text
    #     print(f"Product: {name}, Price: {price}")
     

3. Vòng lặp while

Khái niệm

Vòng lặp while được sử dụng khi bạn muốn lặp lại một khối lệnh chừng nào một điều kiện còn ĐÚNG. Bạn không biết trước chính xác số lần lặp, chỉ biết khi nào thì dừng lại.

Nó giống như việc bạn khuấy một nồi súp và liên tục khuấy trong khi (while) súp chưa sôi. Khi súp sôi (điều kiện trở thành SAI), bạn dừng lại.

Cú pháp

⚠️ Cảnh báo: Phải có một dòng code bên trong vòng lặp while làm thay đổi điều kiện lặp. Nếu không, bạn sẽ tạo ra một vòng lặp vô hạn (infinite loop)!

 
# Ví dụ: Đếm ngược từ 5 về 1
count = 5
while count > 0:
    print(count)
    count -= 1  # Rất quan trọng! Nếu không có dòng này sẽ lặp vô hạn.
print("Bắt đầu!")


Ứng dụng thực tế trong Automation

  • Chờ một phần tử xuất hiện trên trang web: Đây là ứng dụng kinh điển của while trong automation.

    # Giả sử ta đang chờ nút "Thanh toán" xuất hiện
    # is_button_visible = False
    # attempts = 0
    # max_attempts = 10 # Chờ tối đa 10 giây
    
    # while not is_button_visible and attempts < max_attempts:
    #     print("Chưa thấy nút, đang chờ 1 giây...")
    #     # (Code để kiểm tra xem nút đã hiển thị chưa)
    #     # is_button_visible = check_if_button_exists()
    #     # time.sleep(1) # Chờ 1 giây
    #     # attempts += 1
    
    # if is_button_visible:
    #     print("Đã thấy nút! Click vào.")
    # else:
    #     print("Hết thời gian chờ, không tìm thấy nút.")
  • Thử lại một hành động bị lỗi: Khi gọi API có thể bị lỗi mạng, ta muốn thử lại vài lần trước khi bỏ cuộc.

    retry_count = 0
    max_retries = 3
    success = False
    
    while not success and retry_count < max_retries:
        print(f"Calling API, attempt {retry_count + 1}...")
        # response_code = call_api()
        # if response_code == 200:
        #     success = True
        # else:
        #     retry_count += 1
    
    if success:
        print("API call succeeded!")
    else:
        print("API call failed after multiple retries.")


4. So sánh forwhile

Tiêu chí Vòng lặp for Vòng lặp while
Khi nào dùng? Khi biết trước số lần lặp hoặc muốn duyệt qua một tập hợp (list, string...). Khi không biết trước số lần lặp, lặp cho đến khi một điều kiện không còn đúng nữa.
Ví dụ Lặp qua danh sách sinh viên. Chờ người dùng nhập đúng mật khẩu.
Nguy cơ Ít nguy cơ. Dễ gây ra vòng lặp vô hạn nếu quên cập nhật điều kiện.


5. Từ khóa breakcontinue

Đây là 2 công cụ giúp ta kiểm soát vòng lặp một cách linh hoạt hơn.

5.1 break:

Dừng lại khi đã tìm thấy thứ mình cần 🎯 hay còn có ý nghĩa là thoát ngay lập tức khỏi vòng lặp (cả forwhile), không quan tâm các lần lặp còn lại.

Khi mục tiêu của bạn là tìm một thứ gì đó trong một danh sách và bạn đã tìm thấy nó, việc tiếp tục tìm kiếm ở phần còn lại của danh sách là không cần thiết và lãng phí thời gian. break giúp bạn thoát khỏi vòng lặp ngay lập tức để tiết kiệm tài nguyên.

Ví dụ: 

# Tìm số 5 trong danh sách và dừng lại ngay
numbers = [1, 8, 3, 5, 9, 2]
for num in numbers:
    print("Đang xét số:", num)
    if num == 5:
        print("Đã tìm thấy số 5!")
        break # Thoát khỏi vòng lặp ngay

 

Ứng dụng thực tế trong Automation:

Kịch bản: Bạn đang kiểm thử chức năng tìm kiếm của một trang thương mại điện tử. Sau khi tìm kiếm "MacBook Pro 16 inch", trang web trả về 20 sản phẩm. Mục tiêu của bạn là xác nhận rằng sản phẩm chính xác có tồn tại trong kết quả trả về, sau đó click vào nó.


Cách triển khai:
Bạn sẽ dùng vòng lặp for để duyệt qua danh sách 20 sản phẩm. Bên trong vòng lặp, bạn kiểm tra xem tên sản phẩm có khớp chính xác với "MacBook Pro 16 inch" hay không.

  • Nếu khớp, bạn đã hoàn thành mục tiêu. Bạn sẽ click vào sản phẩm đó và dùng break để thoát khỏi vòng lặp ngay lập tức. Không cần phải kiểm tra sản phẩm thứ 10, 11, 12... nữa.

  • Nếu không khớp, vòng lặp tiếp tục.

# Giả sử `search_results` là một list chứa các phần tử web của sản phẩm
# search_results = driver.find_elements(By.CSS_SELECTOR, ".product-item")

product_to_find = "MacBook Pro 16 inch"
is_found = False

print("Bắt đầu tìm kiếm sản phẩm...")
for product_element in search_results:
    # Lấy tên của sản phẩm từ phần tử web
    product_name = product_element.find_element(By.CSS_SELECTOR, ".product-name").text
    print(f"Đang kiểm tra: '{product_name}'")

    if product_name == product_to_find:
        print(f"✅ Đã tìm thấy sản phẩm '{product_to_find}'!")
        # Click vào sản phẩm này
        # product_element.click()
        is_found = True
        break  # THOÁT NGAY LẬP TỨC! Không cần kiểm tra các sản phẩm còn lại.

if not is_found:
    print(f"❌ TEST FAILED: Không tìm thấy sản phẩm '{product_to_find}' trong kết quả.")​


👉 Lợi ích: Kịch bản test chạy nhanh hơn, đặc biệt khi danh sách kết quả dài (hàng trăm sản phẩm) và sản phẩm cần tìm nằm ở ngay đầu danh sách.


5.2 continue:
Bỏ qua những thứ không liên quan ⏭️ hay còn có thể hiểu là  bỏ qua lần lặp hiện tại và nhảy ngay đến lần lặp tiếp theo.

Khi bạn cần xử lý một danh sách nhưng muốn bỏ qua một vài phần tử không đáp ứng điều kiện nào đó, continue sẽ giúp bạn nhảy thẳng đến phần tử tiếp theo mà không cần thực thi phần còn lại của khối lệnh trong lần lặp đó.

Ví dụ

# In ra các số lẻ từ 1 đến 10
for i in range(1, 11):
    if i % 2 == 0: # Nếu i là số chẵn
        continue # Bỏ qua lần lặp này, không chạy lệnh print
    print(i)
 

Ứng dụng thực tế trong Automation:

Kịch bản: Bạn muốn viết một kịch bản để kiểm tra và thu thập tên và giá của tất cả các link sản phẩm trên một trang danh mục. Tuy nhiên, trang này có lẫn cả các banner quảng cáo cũng được đặt trong thẻ link (<a>). Kịch bản của bạn cần bỏ qua các link quảng cáo này.

Cách triển khai: Bạn sẽ dùng vòng lặp for để duyệt qua tất cả các thẻ link (<a>) tìm được. Bên trong vòng lặp, bạn kiểm tra xem link đó có phải là link quảng cáo hay không (ví dụ: dựa vào URL chứa từ "ads" hoặc "quangcao").

  • Nếu là link quảng cáo, bạn dùng continue để bỏ qua lần lặp này và đi ngay đến link tiếp theo. Các dòng code để lấy tên và giá sản phẩm sẽ không được thực thi.

  • Nếu là link sản phẩm hợp lệ, kịch bản sẽ tiếp tục lấy thông tin.

# Giả sử `all_links` là một list chứa tất cả các phần tử link (thẻ <a>)
# all_links = driver.find_elements(By.TAG_NAME, "a")

product_data = []

print("Bắt đầu thu thập dữ liệu sản phẩm...")
for link_element in all_links:
    # Lấy đường dẫn URL từ thuộc tính 'href'
    url = link_element.get_attribute("href")

    # Điều kiện để bỏ qua: nếu link không tồn tại hoặc là link quảng cáo
    if not url or "googleads" in url or "quangcao" in url:
        print(f"-> Bỏ qua link không hợp lệ hoặc link quảng cáo: {url}")
        continue  # Bỏ qua lần lặp này, đi đến link tiếp theo

    # Nếu không bị 'continue', code ở dưới đây sẽ được thực thi
    # Giả sử chỉ link sản phẩm mới có class 'product-title'
    # try:
    #     product_name = link_element.find_element(By.CSS_SELECTOR, ".product-title").text
    #     product_price = link_element.find_element(By.CSS_SELECTOR, ".price").text
    #     print(f"Thu thập: {product_name} - {product_price}")
    #     product_data.append((product_name, product_price))
    # except:
    #     # Bỏ qua các link không có cấu trúc sản phẩm
    #     continue

print("\nThu thập hoàn tất!")​

 

👉 Lợi ích: Giúp mã nguồn sạch sẽ hơn. Thay vì phải lồng code xử lý sản phẩm vào một khối if lớn (if not is_ad_link:), bạn có thể xử lý các trường hợp ngoại lệ ở đầu và dùng continue để thoát sớm, làm cho logic chính của vòng lặp trở nên rõ ràng hơn

So sánh breakcontinue


Tiêu chí break (Phá vỡ) 💥 continue (Tiếp tục) ⏭️
Mục đích Chấm dứt hoàn toàn vòng lặp ngay lập tức. Bỏ qua lần lặp hiện tại và chuyển ngay sang lần lặp tiếp theo.
Hành động Chương trình sẽ nhảy ra khỏi vòng lặp và thực thi dòng lệnh đầu tiên sau vòng lặp. Chương trình sẽ quay trở lại đầu vòng lặp để bắt đầu một vòng mới.
Tương tự như Nhấn nút "Stop" trên điều khiển. Mọi thứ dừng lại. Nhấn nút "Next" hoặc "Skip" để bỏ qua bài hát hiện tại.
Tình huống Automation Tìm thấy một phần tử duy nhất cần tương tác (ví dụ: tìm đúng sản phẩm "iPhone 15" trong danh sách rồi click vào nó). Xử lý một danh sách nhưng cần lọc bỏ các phần tử không hợp lệ (ví dụ: lấy thông tin tất cả sản phẩm nhưng bỏ qua những sản phẩm "đã hết hàng").

6. Tóm tắt buổi học

  • Cấu trúc điều kiện if-elif-else giúp chương trình "ra quyết định".

  • Vòng lặp for dùng để duyệt qua các phần tử trong một tập hợp đã biết.

  • Vòng lặp while dùng để lặp khi một điều kiện còn đúng, chưa biết trước số lần lặp.

  • break dùng để thoát khỏi vòng lặp, continue dùng để bỏ qua lần lặp hiện tại.

  • Luôn nhớ thụt lề (indentation) và dấu hai chấm (:) trong các cấu trúc này.

Teacher

Teacher

Hà Lan

QA Automation

With over 5 years of experience in web, API, and mobile test automation, built strong expertise in designing and maintaining automation frameworks across various domains and international projects. Committed to mentoring and knowledge sharing, I provide practical guidance and proven techniques to help aspiring testers develop their skills and succeed in the automation field.

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học