js的滾動條scrollIntoView()
Arguments[] - python與js之間的羈絆
1、移動到元素element對象的“底端”,與當前窗口的“底部”對齊:
driver.execute_script("arguments[0].scrollIntoView(false);",element)
2、移動到元素element對象的”頂端“,與當前窗口的”頂部“對齊(默認true):
driver.execute_script("arguments[0].scrollIntoview();", element)
3、移動到頁面底部:
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
4、移動到頁面頂部:
driver.execute_script("window.scrollTo(document.body.scrollHeight,0)")
二、使用的場景:
在selenium(python語言)做元素定位時,如果網頁不支持自動滾動的話,有的元素在頁面的不可見區域,這時候需要scrollIntoView()將其拖動到可見區域
舉個栗子:
以百度搜索為例:搜索selenium,定位Selenium-簡書這個鏈接,注意看滾動條的位置
代碼如下:
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys # 創建Chrome對象 driver = webdriver.Chrome() # 訪問百度 driver.get('http://baidu.com') # 搜索selenium driver.find_element_by_id('kw').send_keys("selenium", Keys.ENTER) # 等待元素出現,滾動到定位元素處,在點擊操作 loc = (By.XPATH, '//div[@id="6"]//a[contains(text(), "簡書")]') WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc)) ele = driver.find_element(*loc) # 執行js操作 driver.execute_script("arguments[0].scrollIntoView();", ele)
# 點擊
ele.click()
在這里有一個坑,大家注意一下,由於我使用的是與當前窗口頂部對齊,百度經過特殊處理,百度搜索的框類似於excel固定首行的功能,頁面滾動后,百度搜索框是固定不動的,所以與當前窗口頂部對齊就會出現百度搜索框遮擋住我們想要定位的鏈接(Selenium-簡書這個鏈接),如圖所示:
所以,想要這個鏈接顯示出來的話,使用與當前窗口底部對齊的這個用法,這樣就可以看到了,如圖所示:
# 執行js操作 driver.execute_script("arguments[0].scrollIntoView(false);", ele)
這樣就完美解決問題。
3、selenium中日期選擇框操作
網頁日期框一般都是選擇的,無法輸入,選擇日期時元素定位不穩定,影響元素操作
接下來通過修改元素屬性來輸入日期,照樣還是用execute_script方法來實現
舉個栗子:(以12306訂票為例)
通過js操作來實現對日期輸入框的寫入,首先使用dom對象定位元素,得到元素的value值,其實就是日期,日期框元素reaOnly的屬性默認為true,是不可輸入的狀態;通過dom對象對元素的屬性進行更改,readOnly=false,這樣日期框就是可寫入的狀態,再次修改value的值,這樣就搞定了
下邊為代碼示例:
from selenium import webdriver # 創建對象Chrome driver = webdriver.Chrome() # 窗口最大化 driver.maximize_window() # 訪問12306 driver.get('https://www.12306.cn/index/') # 通過js操作寫入日期 js_data = """ var e = document.getElementById("train_date") e.readOnly = false e.value = "2019-09-20" """
# 輸入日期
driver.executed_script(js_data)