2016-01-24 6 views
10

Ich muss durch alle Seiten auf meiner Webseite gehen. Es gibt eine Dropdown-Box in der linken oberen Ecke auf allen diesen Seiten mit allen verfügbaren Städten. Ich möchte jede Seite besuchen, indem ich jede Position in dieser Dropdown-Box auswähle. Die Drop-Down-Box verfügt über eine Bildlaufleiste, und wenn ich die Option wählen möchten, die unter ihm ist, es gibt mir Ausnahmemeldung:Element ist derzeit nicht sichtbar und kann daher nicht mit Selenium Dropdown Box Python

Message: Element is not currently visible and so may not be interacted with 
Stacktrace: 
    at fxdriver.preconditions.visible (file:///tmp/tmpHWLMyH/extensions/[email protected]/components/command-processor.js:9981) 
    at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmpHWLMyH/extensions/[email protected]/components/command-processor.js:12517) 
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpHWLMyH/extensions/[email protected]/components/command-processor.js:12534) 
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpHWLMyH/extensions/[email protected]/components/command-processor.js:12539) 
    at DelayedCommand.prototype.execute/< (file:///tmp/tmpHWLMyH/extensions/[email protected]/components/command-processor.js:12481) 

Heres der Code:

#!/bin/env/python 
# -*- coding: utf-8 -*- 

import time 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 

def get_browser(): 
    return webdriver.Firefox() 


main_page_url = "http://example.com/" 
basic_url = 'http://example.com/ogloszenia-kobiet.html' 

def get_city_list(url) : 

    AGE_ACCEPT_BUTTON_XPATH = ".//*[@id='columns']/div/div[2]/section/div/div/div/div/div/div[2]/div[2]/a[2]" 
    COMBOBOX_XPATH = ".//*[@id='select_city']/li/form/div/button" 
    COMBOBOX_OPTION_XPATH = ".//*[@id='select_city']/li/form/div/div/ul/li[%s]/a/span[1]" 
    CHOOSE_BUTTON_XPATH = ".//*[@id='select_city']/li/form/button" 

    pages = [] 

    try: 
     browser = get_browser() 
     wait = WebDriverWait(browser, 100) 
     browser.get(main_page_url) 
     time.sleep(2) 

     button_age_accept = browser.find_element_by_xpath(AGE_ACCEPT_BUTTON_XPATH) 
     button_age_accept.click() 
     time.sleep(10) 

     browser.get(url) 

     i = 2 

     while(True) : 
      try : 

       button_combobox = browser.find_element_by_xpath(COMBOBOX_XPATH) 
       button_combobox.click() 
       time.sleep(5) 

       element_xpath = COMBOBOX_OPTION_XPATH % i 
       option_in_combobox = browser.find_element_by_xpath(element_xpath) 
       # wait.until(EC.invisibility_of_element_located((By.XPATH, element_xpath))) 
       # option_in_combobox = WebDriverWait(browser, 10).until(lambda browser : browser.find_element_by_xpath(element_xpath)) 
       option_in_combobox.click() 
       time.sleep(5) 

       button_choose = browser.find_element_by_xpath(CHOOSE_BUTTON_XPATH) 
       button_choose.click() 
       time.sleep(5) 

       pages.append(browser.current_url) 

       i += 1 
      except Exception, e: 
       print e 
       break 

     browser.close() 
     return pages 

    except Exception, e: 
     info = 'Generic exception\n' 
     print e 
     return [] 

get_city_list(basic_url) 

ich auch mit Bildlaufleiste versucht , versuchte es runterzuziehen, aber immer noch keinen Effekt. Ich kann nur die Seiten blättern, die am Anfang der Dropdown-Feld sind:

#!/bin/env/python 
# -*- coding: utf-8 -*- 

import time 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium import webdriver 
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.common.exceptions import NoSuchElementException 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 

def get_browser(): 
    return webdriver.Chrome() 


main_page_url = "http://example.com/" 
basic_url = 'http://example.com/ogloszenia-kobiet.html' 

def get_city_list(url) : 

    AGE_ACCEPT_BUTTON_XPATH = ".//*[@id='columns']/div/div[2]/section/div/div/div/div/div/div[2]/div[2]/a[2]" 
    COMBOBOX_XPATH = ".//*[@id='select_city']/li/form/div/button" 
    COMBOBOX_OPTION_XPATH = ".//*[@id='select_city']/li/form/div/div/ul/li[%s]/a/span[1]" 
    CHOOSE_BUTTON_XPATH = ".//*[@id='select_city']/li/form/button" 

    pages = [] 

    try: 
     browser = get_browser() 
     wait = WebDriverWait(browser, 100) 
     browser.get(main_page_url) 
     time.sleep(2) 

     button_age_accept = browser.find_element_by_xpath(AGE_ACCEPT_BUTTON_XPATH) 
     button_age_accept.click() 
     time.sleep(10) 

     browser.get(url) 

     i = 2 

     while(True) : 
      try : 

       button_combobox = browser.find_element_by_xpath(COMBOBOX_XPATH) 
       button_combobox.click() 
       time.sleep(5) 

       element_xpath = COMBOBOX_OPTION_XPATH % i 
       option_in_combobox = browser.find_element_by_xpath(element_xpath) 

       actionChains = ActionChains(browser) 
       scrollbar = browser.find_element_by_xpath("/html/body/section/section[2]/div/div[2]/section/div/div/div/div[1]/ul/li/form/div/div/ul") 
       actionChains.click_and_hold(scrollbar).perform() 
       actionChains.move_by_offset(0,10+i).perform() 
       actionChains.release() 

       browser.execute_script("arguments[0].scrollIntoView();", option_in_combobox) 
       option_in_combobox.click() 

       browser.execute_script("window.scrollTo(0, 0);") 

       button_choose = browser.find_element_by_xpath(CHOOSE_BUTTON_XPATH) 
       button_choose.click() 
       time.sleep(5) 

       pages.append(browser.current_url) 

       i += 1 
      except Exception, e: 
       print e 
       break 

     browser.close() 
     return pages 

    except Exception, e: 
     info = 'Generic exception\n' 
     print e 
     return [] 

pages = get_city_list(basic_url) 
for p in pages : 
    with open('links.txt', 'a') as the_file: 
     the_file.write(p) 
     the_file.write('\n') 

------------------------- -------------------------------------------------- -------------------------------------------------- -------UPDATE: --------------------------------- -------------------------------------------------- -------------------------------------------------

Für jetzt bin ich mit Kubuntu 14.04. Ich habe Python 2.7.11 und Selenium 2.49.2. Mein aktueller Code:

#!/bin/env/python 
# -*- coding: utf-8 -*- 

import time 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium import webdriver 
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.common.exceptions import NoSuchElementException 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 

# def get_browser(): 
#  options = webdriver.ChromeOptions() 
#  options.add_argument("--start-maximized") 
#  return webdriver.Chrome(chrome_options=options) 


def get_browser(): 
    return webdriver.Firefox() 

main_page_url = "http://example.com/" 
basic_url = 'http://example.com/ogloszenia-kobiet.html' 

def get_city_list(url) : 

    AGE_ACCEPT_BUTTON_XPATH = ".//*[@id='columns']/div/div[2]/section/div/div/div/div/div/div[2]/div[2]/a[2]" 
    COMBOBOX_XPATH = ".//*[@id='select_city']/li/form/div/button" 
    COMBOBOX_OPTION_XPATH = ".//*[@id='select_city']/li/form/div/div/ul/li[%s]/a/span[1]" 
    CHOOSE_BUTTON_XPATH = ".//*[@id='select_city']/li/form/button" 

    pages = [] 

    try: 
     browser = get_browser() 
     wait = WebDriverWait(browser, 100) 
     browser.get(main_page_url) 
     time.sleep(2) 

     button_age_accept = browser.find_element_by_xpath(AGE_ACCEPT_BUTTON_XPATH) 
     button_age_accept.click() 
     time.sleep(10) 

     browser.get(url) 

     i = 2 

     while(True) : 
      try : 

       button_combobox = browser.find_element_by_xpath(COMBOBOX_XPATH) 
       button_combobox.click() 
       time.sleep(5) 

       element_xpath = COMBOBOX_OPTION_XPATH % i 
       option_in_combobox = browser.find_element_by_xpath(element_xpath) 
       option_in_combobox.click() 

       button_choose = browser.find_element_by_xpath(CHOOSE_BUTTON_XPATH) 
       button_choose.click() 
       time.sleep(5) 

       pages.append(browser.current_url) 

       i += 1 
      except Exception, e: 
       print e 
       break 

     browser.close() 
     return pages 

    except Exception, e: 
     info = 'Generic exception\n' 
     print e 
     return [] 

pages = get_city_list(basic_url) 
for p in pages : 
    with open('links.txt', 'a') as the_file: 
     the_file.write(p) 
     the_file.write('\n') 

Für Firefox, verlässt der Code am Element 'Gdańsk' mit einer Nachricht: string indices must be integers, so bedeutet es nicht, jedes Element in meiner Combobox findet.

Für Chrome und Windows XP, es endet in Bielsko-Biała, also wieder, es bedeutet, dass es nicht jedes Element in meiner Combobox findet. ...

Wie kann ich dieses Problem lösen?

+1

Erinnerung, dass diese Website hat Benutzer so jung wie 13 als auch Profis die Website von der Arbeit zugreifen, bitte stell keine Verbindung zu Websites Nacktheit in der strittigen . Fügen Sie genügend Details in die Frage ein, damit die Frage beantwortet werden kann. – josliber

Antwort

4

Entweder auf das Element bewegen und klicken Sie dann auf:

from selenium.webdriver.common.action_chains import ActionChains 

actions = ActionChains(browser) 
actions.move_to_element(option_in_combobox).click().perform() 

oder scroll into it's view:

browser.execute_script("arguments[0].scrollIntoView();", option_in_combobox) 

oder klicken Sie auf das Element via javascript:

browser.execute_script("arguments[0].click();", option_in_combobox) 

Für Firefox endet der Code am Element 'Gdańsk' mit einer Nachricht: String-Indizes müssen Integer sein, das heißt, es findet nicht jedes Element in meiner Combobox.

Es gibt ein vorhandenes Problem in Selen 2.49, das dieses TypeError verursachen kann. Sie müssten auf 2 downgraden.48:

pip install selenium==2.48 
+0

Zunächst einmal: Danke für Ihre Antwort. Zweitens: Ich habe meinen Code geändert, wie Sie vorgeschlagen haben, und 1) Ihr zweiter Ansatz (dieser Code: https://gist.github.com/anonymous/00789e9cc3c13fc6477c) gibt mir "Element ist nicht anklickbar ..." und tut es finde nicht alle Links, die ich brauche, nur einige von ihnen 2) deine erste Annäherung (mein Code: https://gist.github.com/anonymous/880841d0166943133a42) gibt 'Element nicht sichtbar' und findet keine Verbindungen überhaupt 3) dein Der dritte Ansatz (mein Code: https://gist.github.com/anonymous/6261a924b4f15760742f) gibt auch "Element nicht sichtbar" und alle Links werden gespeichert ... irgendwelche Ideen? – Katie

+0

@Katie bitte zuerst versuchen Sie die Cyril's Antwort und sehen, ob es hilft. Mal sehen, ob das Problem noch besteht. Vielen Dank. – alecxe

+0

Leider hat dies nicht funktioniert – Katie

3

Wie erwähnt Sie zunächst auf die Option Element auf sie vor dem Klicken bewegen sollte: actions.move_to_element(option_in_combobox).click().perform(). Jetzt ist das 'button_choose'-Element nicht sichtbar, da der Browser nach unten scrollte. Um dies zu beheben müssen Sie nach oben scrollen und klicken Sie dann auf die Schaltfläche:

browser.execute_script("window.scrollTo(0, 0);") # scroll to top 

button_choose = browser.find_element_by_xpath(CHOOSE_BUTTON_XPATH) 
button_choose.click() 
+0

Dies funktioniert auch nicht. Mein Code: http://codepad.org/Utw8X1Dw erhält nur einige der verfügbaren Links, nicht alle. Es scheint, dass es immer noch ein Problem mit dem Scrollen zu den Städten gibt, die sich am Ende dieser Dropdown-Box befinden. – Katie

+0

Ihr Code funktioniert für mich. Ich setzte es auf 40 und es funktionierte für alle Städte am unteren Ende (einschließlich 'Zielona-Gora'). Hinweis: Ich musste Chrome maximieren, um es zum Laufen zu bringen, Firefox funktionierte sofort. – Cyril

+0

Das ist eigentlich komisch. Habe meinen Code sowohl auf Kubuntu als auch auf Windows getestet und habe dieselben Fehler, Beispielfehler für den Code, den ich gepostet habe (getestet unter Windows): https://gist.github.com/anonymous/8a6d50228ac12cc4cc72, https://gist.github.com/anonymous/eac439ef03ce9509e776, geänderter Code: https://gist.github.com/anonymous/a0fc50801436948bbf5c – Katie

3

ich in Java versucht, und seine Arbeit sehr gut. Ich bitte darum, für Schleife hauptsächlich zu schauen, weil hier ich Optionen einzeln auswählen kann. Ich habe nur Thread.sleep benutzt, da ich weiß, dass wir auch Wartezeiten nutzen können. Um eine Frage ähnlich zu machen, die ich hier an StringBuffer angefügt habe, weiß ich, dass wir zu jedem Sammler in Java hinzugefügt werden können. Ich bin nicht genau so, wie zu akzeptieren Alter usw. gefolgt, wie ich sagte, ich auf diesem Drop-Down-Auswahl ..

public class Dog { 

    private WebDriver driver; 
    private String baseUrl; 
    private StringBuffer verificationErrors = new StringBuffer(); 

    @BeforeClass() 
    public void setUp() throws Exception { 
    // driver = new FirefoxDriver(); 
     System.setProperty("webdriver.chrome.driver", "E:\\selenium_setups\\chromedriver_win32\\chromedriver.exe"); 
     driver=new ChromeDriver(); 
    driver.manage().window().maximize(); 
    baseUrl = "http://example.com/"; 
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    } 

    @Test 
    public void testStackoverflowIssue() throws Exception { 

    driver.get(baseUrl); 
    driver.findElement(By.cssSelector(".btn.btn-success")).click(); 
    driver.get("http://example.com/ogloszenia-kobiet.html"); 
    List<WebElement> options=driver.findElements(By.xpath(".//*[@id='select_city']/li/form/div/div/ul/li")); 

    for(int i=1; i<=options.size(); i++){ 

    driver.findElement(By.xpath("(//button[@type='button'])[4]")).click(); 
    driver.findElement(By.xpath("//ul[@id='select_city']/li/form/div/div/ul/li["+i+"]")).click(); 
    driver.findElement(By.cssSelector("button.btn.btn-success")).click(); 
    Thread.sleep(5000); 
    verificationErrors.append(driver.getCurrentUrl()); 
    System.out.println(driver.getCurrentUrl() +" >>> iteration " +i); 
    driver.navigate().to("http://example.com/ogloszenia-kobiet.html"); 
    Thread.sleep(5000); 
    } 
    } 

}

konzentriert hoffe ich, dies wird Ihnen in Python hilft Werte wählen Dropdown ..

Ausgang enter image description here

Danke, Murali

+0

Danke. Ich habe auf 'Selenium 2.48' herabgestuft, wie von @alecxe vorgeschlagen, und deinen Code modifiziert (tatsächlich in Python übersetzt), aber das Problem bleibt gleich. Mein Code erhält nur den sichtbaren Teil des Dropdown-Felds. Wenn ich jedoch das Browser-Fenster in Firefox maximiere, gibt es mir mehr Links als vorherige Ansätze (bis zu "Krakau"). Aber dann, nachdem die "Krakow" erreicht ist, endet das Programm, und es ist nicht möglich, die Elemente von der Unterseite der Dropdown-Box zu bekommen. Mein modifizierter Code ist hier: https://gist.github.com/anonymous/9cb82acf839d6b92731d – Katie

+0

Da ich eine Windows-Programmdatei mit diesem Code erstellen muss, habe ich es auch mit Windows XP und Chrome versucht. Dort ist das Problem genau wie zuvor. Ihr Code kann nur 'Bielsko-Biala' erreichen und endet mit der Aussage, dass 'Element nicht anklickbar ist (1018, 508)' ... Huh – Katie

+0

@Katie, chrometriver geändert. es funktionierte sehr gut siehe Ausgabebild. Ich habe diesen xpath // ul [@ id = 'select_city']/li/form/div/div/ul/li ["+ ​​i +"] verwendet, um Werte im Dropdown-Menü auszuwählen. Ich bin nicht bis zur Spannweite verbraucht. ich hoffe du bist das notiert. danke –

3

dies versuchen, bevor die „Aktuell nicht invisi Auswahl ble Element“, und auf dem Dropdown-Menü klicken:

browser.execute_script("document.getElementsByClassName('dropdown-menu inner selectpicker')[0].setAttribute('style', '');") 
Verwandte Themen