1. 程式人生 > 實用技巧 >selenium自動化過程中視窗控制代碼的問題

selenium自動化過程中視窗控制代碼的問題

1/如果已知接下來的操作會增加新的視窗,可以直接使用如下方法

def switch_to_cur_win(driver):
    try:
        all_win = driver.window_handle
        all_win_num = len(all_win)
        driver.switch_to.window(all_win[all_win_num-1])
    except Exception as e:
        print('切換視窗異常:',e)

2/如果在操作的過程中不知道是否會增加新的視窗,則可以改進一下

def switch_to_cur_win_ifchange(driver, exec_fun=None):
    pre_win_num 
= len(driver.window_handles) if exec_fun is not None: exec_fun() all_win = driver.window_handles cur_win_num = len(all_win) if cur_win_num != pre_win_num: driver.switch_to.window(all_win[cur_win_num - 1])


def
get_element(driver, selector, is_immedite=None): check_loading_is_hide(driver) wait
= WebDriverWait(driver, 10, 0.5) text = None # 支援選擇器中帶文字 比如:div>span[text]=病例 正常選擇器中是沒有這種寫法的 if selector.find("[text]=") > -1: selector, text = selector.split("[text]=") if selector.startswith("/") or selector.find("following-sibling::")>-1: if is_immedite: elements
= driver.find_elements_by_xpath(selector) else: elements = wait.until(EC.presence_of_all_elements_located((By.XPATH, selector))) else: if is_immedite: elements = driver.find_elements_by_css_selector(selector) else: elements = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, selector))) if len(elements) > 0 and text is not None: for ele in elements: if ele.text == text: return ele return None return elements[0] if elements is not None and len(elements) > 0 else None


#呼叫該方法
switch_to_cur_win_ifchange(driver, lambda: get_element(driver, case.get("selector")).click())

3/也可以切換到指定的頁面


# 切換到指定視窗 change_num 負數表示前第幾個視窗,正數表示後第幾個視窗

def
switch_to_win(driver, change_num): all_win = driver.window_handles cur_win = driver.current_window_handle index = all_win.index(cur_win) driver.switch_to.window(all_win[index+change_num])