[英]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 /程序注释:
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.