简体   繁体   English

如何使用多个CSS选择器使代码更具可读性

[英]How can I make my code more readable with multiple css selectors

I am looking for a way to shorten my code. 我正在寻找一种缩短代码的方法。

I am gathering captcha values from https://www.ultimateqa.com/complicated-page/ and submitting them for 3 captcha boxes. 我正在从https://www.ultimateqa.com/complicated-page/收集验证码值,并将其提交给3个验证码框。

Can I shorten my code using a function? 我可以使用函数来缩短代码吗? Or should I use different css selectors? 还是应该使用不同的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)

You can use selector that matches all 3 cases (just separate CSS selectors with comma) and handle them in a loop: 您可以使用匹配所有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)

PS for i in range(1) loop should be removed as it doesn't make any sense for i in range(1)循环中for i in range(1) PS应该删除,因为这没有任何意义

Few pythonic/programmatic notes: 很少的python /程序注释:

  • A for loop with range(1) is iterating once (on the 0th element); 范围为(1)的for循环迭代一次(在第0个元素上); thus, not very useful as regular code iterates once anyways. 因此,它不是很有用,因为常规代码无论如何都要迭代一次。
  • Anytime you see similar code being written down, you can generally abstract the logic into reusable code. 每当您看到类似的代码被写下来时,通常都可以将逻辑抽象为可重用的代码。

I'm personally unfamiliar with selenium and not that great with CSS, but here's a go at the python: 我个人不熟悉硒,但是对CSS不太了解,但是python可以尝试一下:

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)

Let me know in a comment if this works for you! 让我知道是否适合您!

Using my function with JaSON's combined CSS selectors logic: 将我的函数与JaSON的组合CSS选择器逻辑结合使用:

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)

You can use the name attribute with the loop index as parameter 您可以将name属性与循环索引一起用作参数

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)

Or locate all the captcha by partial name and iterate over the list 或按部分名称找到所有验证码,然后遍历列表

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)

No need to relocate the captcha field every time, locate it once and use it. 无需每次都重新定位验证码字段,只需定位一次即可使用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM