Selenium WebDiver 腳本執(zhí)行問題記錄

問題 一

如圖:


ImportError:No module named selenium

其實這個問題我在網(wǎng)上試了幾種方法,當(dāng)時都沒有解決,第二天上班再次嘗試就好了(中間多了一步關(guān)機,開機),所以我也不知道到底是哪一個方法奏效了。
但是第一步先確認(rèn)自己已經(jīng)安裝了 selenium:
pip3 install selenium
如果還是報同樣的錯誤,那就在腳本最頭部加上下面這兩句代碼:

import sys
#print(sys.path)
sys.path.append('/usr/local/lib/python3.6/site-packages/')

代碼里的路徑是你的 Python 所在的路徑。


問題二

如圖:

ImportError:cannot import name webdriver

問題三

如圖:


Message: 'geckodriver' executable needs to be in PATH.

網(wǎng)上有一種方法最簡便,但是很不友好,即使用一條命令安裝geckodriver:

brew install geckodriver

以上方法基本可以放棄(因為我抗拒使用鏡像)。
還有一個方法,稍微麻煩一些,即自己下載geckodriver文件。
下載鏈接:https://github.com/mozilla/geckodriver/releases。下載適合自己的安裝包,解壓后將geckodriverckod 存放至 /usr/local/bin/ 路徑下即可(mac 本)。

Windows系統(tǒng)方法:

  • 下載解壓后將getckodriver.exe復(fù)制到Firefox的安裝目錄下,如(C:\Program Files\Mozilla Firefox),并在環(huán)境變量Path中添加路徑:C:\Program Files\Mozilla Firefox;

  • 重啟cmd或IDLE再次運行代碼即可


問題四:

Message: Process unexpectedly closed with status 0

報這個錯誤是因為需要啟動的瀏覽器 crashed。重啟瀏覽器就好了。

我只是簡簡單單的寫了一個簡簡單單的腳本,竟然遇到了這么多問題,心塞的很吶。腳本真的很簡單:

# coding=utf-8
#!/usr/bin/env python3

import sys
#print(sys.path)
sys.path.append('/usr/local/lib/python3.6/site-packages/')

from selenium import webdriver  

import time


browser = webdriver.Firefox()

time.sleep(5)


browser.get("http://www.baidu.com")
print browser.title

browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()

time.sleep(5)
#刷新當(dāng)前頁面
browser.refresh()
time.sleep(3)
browser.quit()

我的腳本是在Sublime Text 編輯器上進(jìn)行變寫的,也可以在編輯器上執(zhí)行腳本(command+B)。

簡單書一下上面腳本用到的兩個元素定位方法

  • 右鍵單擊選擇“查看元素”,如下圖:


    查看元素
  • 定位元素,如下圖:

元素屬性

因為輸入框元素有 id,所以我們使用 id 進(jìn)行定位,圖中高亮顯示。再如點擊按鈕“百度一下”:


元素屬性

問題五:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe7 in position 0: unexpected end of data

當(dāng)我嘗試使用 CSS 進(jìn)行定位輸入框并輸入漢字文本內(nèi)容的時候出現(xiàn)了上述錯誤,看錯誤類型應(yīng)該是編碼問題,腳本如下:

browser.find_element_by_css_selector("form.fm span.bg.s_ipt_wr.quickdelete-wrap input.s_ipt").send_keys("簡書")

解決辦法,在漢字前加字母 u 即可解決,腳本如下:

browser.find_element_by_css_selector("form.fm span.bg.s_ipt_wr.quickdelete-wrap input.s_ipt").send_keys(u"簡書")

問題六:
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

我嘗試了各種定位元素的方法都是報這樣一個錯誤,元素雖然存在,但是不可見,所以無法對其進(jìn)行click()或者send_keys()操作。比如以下方法均不行:

driver.find_element_by_name('password').send_keys('password')
driver.find_element_by_css_selector("input[type=password]").send_keys("123456")
driver.find_element_by_xpath("http://input[@type='password']").send_keys("123456")

但是在我放棄以后,在解決其他問題的時候無意間嘗試了這個方法,竟然成功了,定位方法如下:

ActionChains(driver).click(driver.find_element(By.ID,'TANGRAM__PSP_3__password')).send_keys("1234567").perform()

問題七:
selenium.common.exceptions.TimeoutException: Message:

這個異常報錯的代碼因為使用了WebDriverWait類,如下:

element = WebDriverWait(driver,10).until(
            EC.element_to_be_clickable((By.XPATH,"(//input[@type='password')")))
        element.click().send_keys("1234567")

這個定位方法是我在嘗試解決問題六的時候使用的,但是還是無法定位成功,解決辦法是使用問題六的辦法:

ActionChains(driver).click(driver.find_element(By.ID,'TANGRAM__PSP_3__password')).send_keys("1234567").perform()

問題八:
selenium.common.exceptions.WebDriverException: Message: TypeError: rect is undefined

這個問題我也沒有解決,采取了一個投機取巧的辦法。使用 Fifefox 瀏覽器時報錯,換了 Chrome瀏覽器,正常。在 stackoverflow 上有一種說法是因為 Firefox 版本的問題。但是我更新的最新版本問題依然存在。


問題九:
selenium.common.exceptions.NoAlertPresentException: Message: no alert open

應(yīng)該是定位到一個元素,點擊以后彈出一個 alert(如下圖),定位的時候總是報錯,無法準(zhǔn)確定位,最后改用步驟六的定位方法,不再報錯,但是想要的 alert 卻沒有出現(xiàn),目前還未找到原因??辞闆r是因為沒有準(zhǔn)確定位到元素,但是如果沒有定位到,為什么沒有異常呢?


alert

貼出腳本,希望有高人能幫助釋疑:

#coding=utf-8
import sys

sys.path.append("/usr/local/lib/python3.6/site-packages/")
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By 




import time

#driver = webdriver.Firefox()
driver = webdriver.Chrome('./chromedriver')
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")


#鼠標(biāo)懸停至“設(shè)置”鏈接
link = driver.find_element_by_link_text('設(shè)置')
ActionChains(driver).move_to_element(link).perform()

#打開“搜索”設(shè)置
driver.find_element_by_link_text("搜索設(shè)置").click()

#保存設(shè)置
#driver.find_element_by_class_name("prefpanelgo").click()
#driver.find_element_by_xpath("http://a[@class='prefpanelgo']").click()
ActionChains(driver).click(driver.find_element(By.CLASS_NAME,'prefpanelgo')).perform()

#texts = driver.switch_to_alert().text
#print("警告的內(nèi)容是%s"%texts)

time.sleep(10)
driver.implicitly_wait(10)

#接受警告框
driver.switch_to_alert().accept()
time.sleep(5)

driver.quit()

問題十:ImportError: cannot import name _imaging

這個問題在獲取屏幕截圖識別驗證碼的時候出現(xiàn),折騰了一天各種辦法都嘗試了依然沒能解決。一直都在使用 Sublime Text 進(jìn)行代碼編寫,也不知道哪里操作不當(dāng)打開了 PyCharm,好久沒有這個了,心想就用一下吧,沒想到問題竟然沒有了。代碼如下:

#coding=utf-8

import sys
sys.path.append("/usr/local/lib/python3.6/site-packages/")
from selenium import webdriver
from PIL import Image,ImageEnhance   
import time

driver = webdriver.Chrome('./chromedriver')
driver.implicitly_wait(10)
driver.get("http://192.168.11.5:3004/#/login")

#登錄
driver.find_element_by_class_name("el-input__inner").send_keys("dmin")
driver.find_element_by_xpath("http://input[@type='password']").send_keys("123456")
driver.save_screenshot('/Users/guxuecheng/Desktop/screenshot.png')


#瀏覽器頁面截屏  
driver.get_screenshot_as_file('/Users/guxuecheng/Desktop/screenImg.png') 

#定位驗證碼位置及大小  
location = driver.find_element_by_class_name('captcha').location  
size = driver.find_element_by_class_name('captcha').size  
left = location['x']  
top =  location['y']  
right = location['x'] + size['width']  
bottom = location['y'] + size['height'] 

#從文件讀取截圖,截取驗證碼位置再次保存  
img = Image.open('/Users/guxuecheng/Desktop/screenImg.png').crop((left,top,right,bottom))  
img = img.convert('L')          #轉(zhuǎn)換模式:L | RGB  
img = ImageEnhance.Contrast(img)#增強對比度  
img = img.enhance(2.0)          #增加飽和度  
img.save('/Users/guxuecheng/Desktop/screenImg.png') 


time.sleep(10)

driver.quit()

驗證碼圖片截屏如下:

精準(zhǔn)截取驗證碼圖片

該窗口的圖片如下:

截取窗口圖片

問題十一:ModuleNotFoundError: No module named 'pytesseract'

解決辦法:
pip install pytesseract


問題十二:pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path

解決辦法:
brew install tesseract
問題十和問題十一都是在識別驗證碼的時候引用一個 module 導(dǎo)致的,不過好在最后也勉強算是成功,很遺憾使用這種方法進(jìn)行驗證碼識別,準(zhǔn)確率很低,有時候甚至什么都識別不出來,代碼如下:

#coding=utf-8

import sys
sys.path.append("/usr/local/lib/python3.6/site-packages/")
from selenium import webdriver
from PIL import Image,ImageEnhance
import pytesseract
import time

driver = webdriver.Chrome('./chromedriver')
#driver = webdriver.Chrome()

driver.implicitly_wait(10)
driver.get("http://192.168.11.5:3004/#/login")

#登錄
driver.find_element_by_class_name("el-input__inner").send_keys("admin")
driver.find_element_by_xpath("http://input[@type='password']").send_keys("123456")
driver.save_screenshot('/Users/guxuecheng/Desktop/screenshot.png')


#瀏覽器頁面截屏  
driver.get_screenshot_as_file('/Users/guxuecheng/Desktop/screenImg.png') 

#定位驗證碼位置及大小  
location = driver.find_element_by_class_name('captcha').location  
size = driver.find_element_by_class_name('captcha').size  
left = location['x']  
top =  location['y']  
right = location['x'] + size['width']  
bottom = location['y'] + size['height'] 

#從文件讀取截圖,截取驗證碼位置再次保存  
img = Image.open('/Users/guxuecheng/Desktop/screenImg.png').crop((left,top,right,bottom))  
img = img.convert('L')          #轉(zhuǎn)換模式:L | RGB  
img = ImageEnhance.Contrast(img)#增強對比度  
img = img.enhance(2.0)          #增加飽和度  
img.save('/Users/guxuecheng/Desktop/screenImg.png')

#讀取識別驗證碼
yanzhengma = Image.open('/Users/guxuecheng/Desktop/screenImg.png')

#text = pytesseract.image_to_string(yanzhengma).strip()
text = pytesseract.image_to_string(yanzhengma)
print('驗證碼是:%s'%text.strip())

driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/form/div[3]/div/div/div[1]/div/input').send_keys(text.strip())


time.sleep(10)
#driver.quit()

問題十三:selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Compound class names not permitted
這個錯誤出現(xiàn)在定位一個登錄按鈕的時候報出,看意思是定位方法無效,這個元素的 class_name是一個復(fù)合 name。
所以換了一個定位方法:
driver.find_element_by_xpath("http://button[@type = 'button']").click()


問題十四

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容