Selenium (Python) сопоставление с образцом - PullRequest
1 голос
/ 06 июля 2019

В настоящее время пишу программу на Python с использованием Selenium, которая заполняет онлайн-форму. После заполнения и отправки формы возможны 3 переадресации.

Я пытаюсь написать функцию, которая определяет, на какую страницу я перенаправлен.

Я написал функцию, используя 3 блока try-кроме, но у меня возникают проблемы с перехватом NoSuchElementException.

def match():

    try:
         match = driver.find_element_by_id("hi")
         return 'condition 1'
    except NoSuchElementException:
        pass

    try:
        match = driver.find_element_by_id("hey")
        return 'condition 2'
    except NoSuchElementException:
        pass

    try:
        match = driver.find_element_by_id("hello")
        return 'condition 3'
    except NoSuchElementException:
        pass

    return 'none'

Я получаю следующее исключение

повысить исключение_класса (сообщение, экран, трассировка стека) selenium.common.exceptions.NoSuchElementException: Сообщение: невозможно найти элемент: [id = "hi"]

Примечание: кто-нибудь знает о более элегантном подходе к сопоставлению с образцом в Python?

1 Ответ

1 голос
/ 06 июля 2019

Исключение возникает из-за того, что селен ищет элемент до того, как элемент был загружен на страницу.

Более элегантный подход заключается в использовании selenium.webdriver.support.ui.WebDriverWait, который позволяет удерживать поток выполнения до тех пор, пока не будет выполнено условие (например, наличие элемента в dom)

для дальнейшего чтения: Selenium ожидает документацию

Используя xpath, вы можете указать несколько элементов внутри условия, поэтому при наличии одного из них условие будет выполнено. Например, см. Этот ответ .

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

def match():        
    switcher = {
        'hi': 'condition 1',
        'hey': 'condition 2',
        'hello': 'condition 3'
    }

    try:

        # Wait for 10 seconds max until one of the elements is present or give up
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, "//div[@id = 'hi' or @id = 'hey' or @id = 'hello'"))
        )            
        return switcher[element.get_attribute('id')]
    except TimeoutException:
        return None    
...