Как я могу сделать свой код более читабельным с помощью нескольких селекторов CSS - PullRequest
0 голосов
/ 24 марта 2019

Я ищу способ сократить свой код.

Я собираю значения капчи из https://www.ultimateqa.com/complicated-page/ и отправляю их для 3 полей капчи.

Могу ли я сократить свой код?код с помощью функции?Или я должен использовать различные селекторы CSS?

for i in range(1):
    cap0 = '#et_pb_contact_form_0 > div.et_pb_contact > form > div > div > p > input'
    captext1= driver.find_element_by_css_selector(cap0).get_attribute("data-first_digit")
    capnumb1 = int(captext1)
    captext2= driver.find_element_by_css_selector(cap0).get_attribute("data-second_digit")
    capnumb2 = int(captext2)
    driver.find_element_by_css_selector(cap0).send_keys(capnumb1 + capnumb2)
for i in range(1):
    cap1 = '#et_pb_contact_form_1 > div.et_pb_contact > form > div > div > p > input'
    captext1= driver.find_element_by_css_selector(cap1).get_attribute("data-first_digit")
    capnumb1 = int(captext1)
    captext2= driver.find_element_by_css_selector(cap1).get_attribute("data-second_digit")
    capnumb2 = int(captext2)
    driver.find_element_by_css_selector(cap1).send_keys(capnumb1 + capnumb2)
for i in range(1):
    cap2 = '#et_pb_contact_form_2 > div.et_pb_contact > form > div > div > p > input'
    captext1= driver.find_element_by_css_selector(cap2).get_attribute("data-first_digit")
    capnumb1 = int(captext1)
    captext2= driver.find_element_by_css_selector(cap2).get_attribute("data-second_digit")
    capnumb2 = int(captext2)
    driver.find_element_by_css_selector(cap2).send_keys(capnumb1 + capnumb2)

Ответы [ 3 ]

2 голосов
/ 24 марта 2019

Несколько питонических / программных нот:

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

Я лично не знаком с селеном и не очень хорош с CSS, но вот пример с питоном:

def get_digit(cap,attr):
    element = driver.find_element_by_css_selector(cap).get_attribute(attr)
    return (element, int(element))

caps = ['#et_pb_contact_form_0', '#et_pb_contact_form_1', '#et_pb_contact_form_2']
cap_end = ' > div.et_pb_contact > form > div > div > p > input'
for cap in caps:
    tmp_cap = cap + cap_end
    captext1, capnumb1 = get_digit(tmp_cap, "data-first_digit")
    captext2, capnumb2 = get_digit(tmp_cap, "data-second_digit")
    driver.find_element_by_css_selector(tmp_cap).send_keys(capnumb1 + capnumb2)

Дайте мне знать в комментарии, если это работает для вас!

Использование моей функции с логикой комбинированных селекторов CSS JaSON:

def get_digit(cap,attr):
    element = driver.find_element_by_css_selector(cap).get_attribute(attr)
    return (element, int(element))

cap_css = '#et_pb_contact_form_0 > div.et_pb_contact > form > div > div > p > input, #et_pb_contact_form_1 > div.et_pb_contact > form > div > div > p > input, #et_pb_contact_form_2 > div.et_pb_contact > form > div > div > p > input'
cap_list = driver.find_elements_by_css_selector(cap_css)
for cap in cap_list:
    captext1, capnumb1 = get_digit(cap, "data-first_digit")
    captext2, capnumb2 = get_digit(cap, "data-second_digit")
    cap.send_keys(capnumb1 + capnumb2)
2 голосов
/ 24 марта 2019

Вы можете использовать селектор, который соответствует всем 3 случаям (только отдельные селекторы CSS с запятой) и обрабатывать их в цикле:

cap_css = '#et_pb_contact_form_0 > div.et_pb_contact > form > div > div > p > input, #et_pb_contact_form_1 > div.et_pb_contact > form > div > div > p > input, #et_pb_contact_form_2 > div.et_pb_contact > form > div > div > p > input'
cap_list = driver.find_elements_by_css_selector(cap_css)
for cap in cap_list:
    captext1= cap.get_attribute("data-first_digit")
    capnumb1 = int(captext1)
    captext2= cap.get_attribute("data-second_digit")
    capnumb2 = int(captext2)
    cap.send_keys(capnumb1 + capnumb2)

P.S. for i in range(1) петля должна быть удалена, так как она не имеет никакого смысла

0 голосов
/ 24 марта 2019

Вы можете использовать атрибут имени с индексом цикла в качестве параметра

for i in range(3):
    cap = driver.find_element_by_css_selector(f'[name="et_pb_contact_captcha_{i}"]')
    captext = cap.get_attribute("data-first_digit")
    capnumb1 = int(captext)
    captext = cap.get_attribute("data-second_digit")
    capnumb2 = int(captext)
    cap.send_keys(capnumb + capnumb2)

Или найдите всю капчу по частичному имени и переберите список

captchas = driver.find_elements_by_css_selector('[name^="et_pb_contact_captcha_"]')

for cap in captchas:
    captext = cap.get_attribute("data-first_digit")
    capnumb1 = int(captext)
    captext = cap.get_attribute("data-second_digit")
    capnumb2 = int(captext)
    cap.send_keys(capnumb + capnumb2)

Нет необходимости каждый раз перемещать поле капчи, найдите его один раз и используйте.

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