Как найти общий xpath веб-элемента в Python - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно найти правильную форму входа на веб-странице (она должна работать на разных сайтах, поэтому я не могу просто использовать идентификатор или подобное, потому что, очевидно, может измениться для разных сайтов).

Что я делаю, так это чтобы найти всю форму, а затем попытаться найти ту, в которой всего три элемента (пользователь, пароль и кнопка доступа)

user_field_list = ["username", "email", "user", "prova", "login_email", "session[username_or_email]"]
pass_field_list = ["password","Password", "pass", "login_password", "session[password]"]
button_field_list = ["Accedi", "login", "access", "Avanti"]
for form in browser.find_elements_by_xpath('.//form'):
   count=0
   find_user=0
   find_pass=0
   find_button=0
   for input_field in form.find_elements_by_xpath('.//input'):
      if (input_field.get_attribute("type") not in "hidden"):
         count=count+1
      if(find_pass == 0):
          for passkey in pass_field_list:
              if (passkey in input_field.get_attribute("type")):
                find_pass = 1
      if (find_user==0):
          for userkey in user_field_list:
             if (userkey in input_field.get_attribute("type")):
                find_user=1
      if (find_button==0):
          if ("submit" in input_field.get_attribute("type")):
              find_button=1

С помощью некоторой отладки я убедился, что она нашла правильную форму, но в конце этой части я должен передать ссылку на три поля другой функции, которая должна выполнить вход

def general_login(browser, xpath_user, xpath_pass, xpath_button):
    print("general_login")
    try:
        print("System Log: SEARCH FOR USER FIELD ")
        print (str(xpath_user))
        username = browser.find_element_by_xpath(xpath_user)
        print("System Log: FOUND USER FIELD")
        username.send_keys(usernameStr)
        print("System Log: SEARCH FOR PASSWORD FIELD")
        password = browser.find_element_by_xpath(xpath_pass)
        print("System Log: FOUND PASSWORD FIELD")
        password.send_keys(passwordStr)
        print("System Log: SEARCH FOR BUTTON ACCEDI")
        accediButton = browser.find_element_by_xpath(xpath_button)
        print("System Log: FOUND BUTTON ACCEDI")
        accediButton.click()
        return 0
    except:
        return 1

Проблема в том, что я не знаю, как извлечь три общих xpath из webElements (и у меня нет альтернативной идеи о том, как передать правильные ссылки на функцию).

Кто-то может мне помочь, как получить xpaths или другие возможности, которые я могу использовать? Спасибо!

1 Ответ

0 голосов
/ 13 апреля 2019

Вы можете передавать элементы в general_login вместо попытки получить xpath из WebElement.

Ниже get_form_fields метод возвращает пустой или со словарем полей формы.Если словарь пуст general_login не удастся:

def get_form_fields(browser, user_field_types, password_field_types, button_types):
    # get form fields as dictionary with keys: user_field, password_field, submit_button

    form_fields = {}
    for form in browser.find_elements_by_xpath('.//form'):

        inputs = list(filter(lambda x: x.is_displayed(), form.find_elements_by_xpath('.//input')))
        if len(inputs) < 3:
            continue

        user_field_list = list(filter(lambda x: x.get_attribute("type") in user_field_types, inputs))
        if len(user_field_list) != 1:
            form_fields.clear()
            continue
        else:
            form_fields["user_field"] = user_field_list[0]

        password_field_list = list(filter(lambda x: x.get_attribute("type") in password_field_types, inputs))
        if len(password_field_list) != 1:
            form_fields.clear()
            continue
        else:
            form_fields["password_field"] = password_field_list[0]

        button_list = list(filter(lambda x: x.get_attribute("type") in button_types, inputs))
        if len(button_list) != 1:
            form_fields.clear()
            continue
        else:
            form_fields["submit_button"] = button_list[0]

    return form_fields

И general_login использовать:

def general_login():
    user_field_types = ["username", "email", "user", "prova", "login_email", "session[username_or_email]"]
    password_field_types = ["password", "Password", "pass", "login_password", "session[password]"]
    button_types = ["Accedi", "login", "access", "Avanti"]
    form_fields = get_form_fields(browser, user_field_types, password_field_types, button_types)

    assert form_fields

    print("general_login")
    print("System Log: SEARCH FOR USER FIELD ")
    form_fields["user_field"].send_keys(username)

    print("System Log: SEARCH FOR PASSWORD FIELD")
    form_fields["password_field"].send_keys(password)

    print("System Log: SEARCH FOR BUTTON ACCEDI")
    form_fields["submit_button"].click()


browser = webdriver.Chrome()

username = "user"
password = "password"

general_login()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...