2016-11-19 136 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