2016-11-19 133 views
1

我想在現場編程選擇貨幣:http://www.asos.com/asos/asos-skinny-chinos-in-dark-khaki/prd/5542109select_by_visible_text蟒蛇硒ElementNotVisibleException

但是它做的一些問題對我來說,我使用這下面的一段代碼:

def set_currency(text): 
    one = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, "selected-currency"))) 
    one.click() 
    select_element = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.ID, "currencyList"))) 
    select = Select(select_element) 
    select.select_by_visible_text(text) 

有時給我這個錯誤:selenium.common.exceptions.ElementNotVisibleException:在這一行select.select_by_visible_text(text)但有時它工作得很好。我使用WebDriverWait,直到它可見,所以我不明白爲什麼它 s做這個錯誤。如果需要的話

完整的錯誤:

Traceback (most recent call last): 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 35, in <module> 
    set_currency(currency) 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 18, in set_currency 
    select.select_by_visible_text(text) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\select.py", line 120, in select_by_visible_text 
    self._setSelected(opt) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\select.py", line 212, in _setSelected 
    option.click() 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webelement.py", line 77, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webelement.py", line 494, in _execute 
    return self._parent.execute(command, params) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute 
    self.error_handler.check_response(response) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.ElementNotVisibleException: Message: {"errorMessage":"Element is not currently visible and may not be manipulated","request":{"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:17758","User-Agent":"Python-urllib/3.5"},"httpVersion":"1.1","method":"POST","post":"{\"id\": \":wdc:1479563250968\", \"sessionId\": \"b2aa4180-ae5e-11e6-b8b3-e1a4ad040bb7\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/b2aa4180-ae5e-11e6-b8b3-e1a4ad040bb7/element/:wdc:1479563250968/click"}} 
Screenshot: available via screen 

編輯:

當前代碼:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 
from selenium.common.exceptions import ElementNotVisibleException 
import traceback 
from selenium.webdriver.support.select import Select 

driver1 = webdriver.PhantomJS(r'C:\Users\dodob\Desktop\Apps Workspace\phantomjs-2.1.1-windows\bin\phantomjs.exe') 

def set_currency(label): 
    is_change_currency_displayed = driver1.find_element_by_id("currencyList").is_displayed() 
    if not is_change_currency_displayed: 
     print("dropdown is not displayed.") 
     one = WebDriverWait(driver1, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "selected-currency"))) 
     one.click() 
    select_element = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.ID, "currencyList"))) 
    select = Select(select_element) 
    select.select_by_visible_text(label) 


def get_all_currencies(): 
    one = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, "selected-currency"))) 
    one.click() 
    el = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.ID, "currencyList"))) 
    currency2 = [] 
    options = el.find_elements_by_tag_name('option') 
    for option in options: 
     currency2.append(option.text) 
    return currency2 


def main(url): 
    print(url) 
    driver1.get(url) 
    to_return_string = '' 
    list_of_currencies = get_all_currencies() 
    print(list_of_currencies) 
    for currency in list_of_currencies: 
     try: 
      set_currency(currency) 
      current_price = WebDriverWait(driver1, 10).until(
       EC.visibility_of_element_located((By.CSS_SELECTOR, ".current-price"))) 
      to_return_string += ("In " + currency + " : " + current_price.text + ' \n') 
      print("In", currency, ":", current_price.text) 
     except TimeoutException: 
      print(traceback.print_exc()) 
      print("In", currency, ":", "Timed out waiting for page to load") 
      to_return_string += ("In " + currency + " : " + " Timed out waiting for page to load" + ' \n') 
     except ElementNotVisibleException: 
      print(traceback.print_exc()) 
    return to_return_string 


main('http://www.asos.com/it/asos/asos-jeans-skinny-alla-caviglia-kaki/prd/6759361') 

電流輸出:

C:\Python\Python35\python.exe C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py 
http://www.asos.com/it/asos/asos-jeans-skinny-alla-caviglia-kaki/prd/6759361 
['£ GBP', '$ USD', 'C$ CAD', 'kr SEK', 'kr NOK', 'kr DKK', '₣ CHF', ' € EUR', '$ AUD', '¥ RMB', '$ HKD', '$ NZD', '$ SGD', 'NT$ TWD', 'руб. RUB'] 
In £ GBP : € 33,99 
In $ USD : € 33,99 
None 
Traceback (most recent call last): 
In C$ CAD : Timed out waiting for page to load 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 43, in main 
    set_currency(currency) 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 19, in set_currency 
    select_element = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.ID, "currencyList"))) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until 
    raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 

dropdown is not displayed. 
In kr SEK : € 33,99 
In kr NOK : € 33,99 
None 
Traceback (most recent call last): 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 43, in main 
    set_currency(currency) 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 21, in set_currency 
    select.select_by_visible_text(label) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\select.py", line 120, in select_by_visible_text 
    self._setSelected(opt) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\select.py", line 212, in _setSelected 
    option.click() 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webelement.py", line 77, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webelement.py", line 494, in _execute 
    return self._parent.execute(command, params) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute 
    self.error_handler.check_response(response) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.ElementNotVisibleException: Message: {"errorMessage":"Element is not currently visible and may not be manipulated","request":{"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:60873","User-Agent":"Python-urllib/3.5"},"httpVersion":"1.1","method":"POST","post":"{\"id\": \":wdc:1479841552848\", \"sessionId\": \"aae52750-b0e6-11e6-a0c1-5193111f996c\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/aae52750-b0e6-11e6-a0c1-5193111f996c/element/:wdc:1479841552848/click"}} 
Screenshot: available via screen 

dropdown is not displayed. 
In ₣ CHF : € 33,99 
In € EUR : € 33,99 
Traceback (most recent call last): 
None 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 43, in main 
    set_currency(currency) 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 21, in set_currency 
    select.select_by_visible_text(label) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\select.py", line 120, in select_by_visible_text 
    self._setSelected(opt) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\select.py", line 212, in _setSelected 
    option.click() 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webelement.py", line 77, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webelement.py", line 494, in _execute 
    return self._parent.execute(command, params) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute 
    self.error_handler.check_response(response) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.ElementNotVisibleException: Message: {"errorMessage":"Element is not currently visible and may not be manipulated","request":{"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:60873","User-Agent":"Python-urllib/3.5"},"httpVersion":"1.1","method":"POST","post":"{\"id\": \":wdc:1479841552851\", \"sessionId\": \"aae52750-b0e6-11e6-a0c1-5193111f996c\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/aae52750-b0e6-11e6-a0c1-5193111f996c/element/:wdc:1479841552851/click"}} 
Screenshot: available via screen 

dropdown is not displayed. 
In ¥ RMB : € 33,99 
In $ HKD : € 33,99 
None 
In $ NZD : Timed out waiting for page to load 
Traceback (most recent call last): 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 43, in main 
    set_currency(currency) 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 19, in set_currency 
    select_element = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.ID, "currencyList"))) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until 
    raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 

dropdown is not displayed. 
In $ SGD : € 33,99 
In NT$ TWD : € 33,99 
None 
Traceback (most recent call last): 
In руб. RUB : Timed out waiting for page to load 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 43, in main 
    set_currency(currency) 
    File "C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py", line 19, in set_currency 
    select_element = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.ID, "currencyList"))) 
    File "C:\Python\Python35\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until 
    raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 


Process finished with exit code 0 
+0

,當你有重疊的元素,你的元素是不可見的 – thebadguy

+0

@thebadguy它並不能幫助我太多一般會出現這種錯誤。 ..:/ – DAVIDBALAS1

+0

聽起來像是一種競爭條件。顯式等待,只能等到元素可見時,一旦元素可見,它將繼續執行代碼序列中的下一行。聽起來像你可能需要隱式或只是在顯式和動作之間的睡眠。我建議這只是因爲它有時有效,有時不會。 – IamBatman

回答

1

問題:

代碼似乎要被罰款。但是這是調用的順序造成的問題。

當以下行被稱爲main方法:

list_of_currencies = get_all_currencies() 

你在下面一行get_all_currencies的點擊selected-currency()方法:

one.click() // opens the "Change-Currency" dropdown menu as shown in below image 

,並在沒有采取進一步行動方法。

然後我們在for loop of main method中稱set_currency(currency)

set_currency(currency)方法中,我們再次點擊selected-currency,這實際上是關閉打開的下拉菜單Change-Currency,這會導致元素不可見異常。

解決方案:

所以,改變流量,以確保您調用set_by_visible_text方法之前Change-Currency下拉菜單打開。

檢查Change-Currency下拉菜單是否已使用isDisplayed方法打開。

以下是代碼:(一開始添加2個新行)

def set_currency(label): 
    isChangeCurrencyDisplayed = driver.find_element_by_id("currencyList").is_displayed() 
    if not isChangeCurrencyDisplayed: 
     print "dropdown is not displayed." 
     one = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "selected-currency"))) 
     one.click() 
    select_element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "currencyList"))) 
    select = Select(select_element) 
    select.select_by_visible_text(text) # here text is "$ USD" 
+0

我明白你在說什麼,但是之前它對我很好,因爲每次你切換貨幣頁面刷新,然後就沒事了。不過,我試着用你的代碼運行它,我也更新了線程並添加了新的完整代碼和完整的輸出。 – DAVIDBALAS1

+0

可以請你加入這裏的討論https://chat.stackoverflow.com/rooms/128720/automation –

+0

更新了代碼併爲我工作。請檢查。這裏的水平是文本「$美元」(如果你想要更改標籤) –

0

您可以等待想要選擇元素(貨幣元素)出現:

select_visible_element = WebDriverWait(driver1, 10).until(EC.visibility_of_element_located((By.XPATH, "//a[contains(text(),'%s')]" %text))) 

另外,您可以點擊下拉,等待select_visible_elementclick()的它,而不是選擇。

+0

它不適用於我, 文件「C:/Users/dodob/PycharmProjects/AsosPriceCheckerWindows/currency.py」,第15行,set_currency EC.visibility_of_element_located((By.XPATH,「// a [包含(text(),'%​​s')]「%text))) 第80行中的文件」C:\ Python \ Python35 \ lib \ site-packages \ selenium \ webdriver \ support \ wait.py「直到 舉報TimeoutException(消息,屏幕,堆棧跟蹤) selenium.common.exceptions.TimeoutException:消息: 屏幕截圖:可通過屏幕 – DAVIDBALAS1

+0

@ DAVIDBALAS1您看到下拉菜單在等待貨幣元素之前打開嗎? – Moshisho