from seleniumwire import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By def login_bp(url, username, password): driver = webdriver.ChromeOptions() driver.add_experimental_option('detach', True) browser = webdriver.Chrome(options=driver) browser.get(url) driver.request_interceptor = lambda request: request username_input = browser.find_element(by=By.XPATH,value='//*[@id="username"]') username_input.send_keys(username) password_input = browser.find_element(by=By.XPATH,value='//*[@id="password"]') password_input.send_keys(password) login_btn = browser.find_element(by=By.ID, value='denglub') login_btn.send_keys(Keys.ENTER) xhr_request = browser.wait_for_request('http://pfs.ikhtech.com/FAPI/Login', timeout=1) cookies = browser.get_cookies()[0].get('secure') print("'username':"+username+",'password':"+password+",'响应体':"+xhr_request.response.body.decode('utf-8')+",'是否成功':"+str(cookies)) return driver if __name__ == '__main__': atr_url = { 'url' : 'http://pfs.ikhtech.com/FAPI/login.jsp', 'username' : 'zhangwei', 'password' : 'zhangwei' } go = login_bp(atr_url['url'], atr_url['username'], atr_url['password']) 如何优化
时间: 2024-04-18 14:27:40 浏览: 231
以下是对你提供的代码进行一些优化的建议:
1. 避免使用绝对路径定位元素:在你的代码中,使用了绝对路径定位元素(例如`By.XPATH`)。这样做的问题是,如果页面结构发生变化,你的代码可能会失效。建议使用更具有稳定性的定位方式,例如使用`By.ID`或`By.NAME`等。
2. 使用显式等待:在等待页面元素出现时,你可以使用显式等待(`WebDriverWait`)来替代`time.sleep()`。显式等待会在一定时间内不断尝试查找元素,直到成功或超时。这样可以提高代码的效率和稳定性。
3. 减少网络请求等待时间:在代码中,你使用了`browser.wait_for_request()`来等待XHR请求。你可以通过设置显式等待的超时时间来减少等待时间,并确保在超时时进行处理。
4. 使用更具描述性的变量名:为了提高代码的可读性,建议使用更具描述性的变量名。例如,将`go`改为`driver`更好地表达了其含义。
5. 添加异常处理:在使用Selenium时,可能会遇到各种异常情况,例如元素找不到、网络请求超时等。为了提高代码的健壮性,建议添加适当的异常处理机制,例如使用`try-except`块来捕获和处理异常。
下面是优化后的代码示例:
```python
from seleniumwire import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def login_bp(url, username, password):
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)
browser = webdriver.Chrome(options=options)
browser.get(url)
wait = WebDriverWait(browser, 10) # 设置显式等待的超时时间为10秒
username_input = wait.until(EC.presence_of_element_located((By.ID, 'username')))
username_input.send_keys(username)
password_input = wait.until(EC.presence_of_element_located((By.ID, 'password')))
password_input.send_keys(password)
login_btn = wait.until(EC.element_to_be_clickable((By.ID, 'denglub')))
login_btn.send_keys(Keys.ENTER)
wait.until(lambda driver: 'http://pfs.ikhtech.com/FAPI/Login' in [r.url for r in driver.requests])
cookies = browser.get_cookies()[0].get('secure')
xhr_request = browser.wait_for_request('http://pfs.ikhtech.com/FAPI/Login', timeout=1)
print("'username':"+username+",'password':"+password+",'响应体':"+xhr_request.response.body.decode('utf-8')+",'是否成功':"+str(cookies))
return browser
if __name__ == '__main__':
atr_url = {
'url' : 'http://pfs.ikhtech.com/FAPI/login.jsp',
'username' : 'zhangwei',
'password' : 'zhangwei'
}
driver = login_bp(atr_url['url'], atr_url['username'], atr_url['password'])
```
希望这些优化建议能对你有所帮助!
阅读全文