首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >元素当前不可见,因此可能无法与Selenium下拉Box Python交互。

元素当前不可见,因此可能无法与Selenium下拉Box Python交互。
EN

Stack Overflow用户
提问于 2016-01-24 17:57:54
回答 3查看 5.8K关注 0票数 10

我需要浏览我网页上的所有页面。在所有这些页面的左上角都有一个下拉框,其中有所有可用的城市。我想访问每一页,通过选择这个下拉框中的每一个位置。下拉框有一个滚动条,当我想选择它下面的选项时,它会给出异常消息:

代码语言:javascript
运行
复制
Message: Element is not currently visible and so may not be interacted with
Stacktrace:
    at fxdriver.preconditions.visible (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:9981)
    at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:12517)
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:12534)
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:12539)
    at DelayedCommand.prototype.execute/< (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:12481)

这是代码:

代码语言:javascript
运行
复制
#!/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)

我也试过用滚动条,试着向下移动,但仍然没有效果。我只能滚动这个下拉框顶部的页面:

代码语言:javascript
运行
复制
#!/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')

-----------------------------------------------------------------------------------------------------------

现在,我正在使用Kubuntu 14.04。我有Python 2.7.11Selenium 2.49.2。我现在的代码是:

代码语言:javascript
运行
复制
#!/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')

对于火狐,代码存在于元素'Gdańsk‘处,并带有一条消息:ń,这意味着它不会在我的组合框中找到每个元素。

对于Chrome和Windows,它存在于‘Bielskoła’,因此,这意味着它并不能在我的组合框中找到所有元素。..。

我怎样才能解决这个问题?

EN

Stack Overflow用户

发布于 2016-01-30 15:03:34

我试过用java,它的工作非常好。我请求看看循环主要是因为这里我可以选择一个一个的选项。我只是使用了Thread.sleep,因为我知道我们也可以使用等待。为了与我刚才附加到StringBuffer中的问题类似,我知道我们可以在java中添加到任何收集器中。我并没有像我说的那样被严格地跟踪到接受年龄等方面。

代码语言:javascript
运行
复制
 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);
  }
  }

}

我希望这将有助于您在python中选择下拉值。

输出

谢谢你,Murali

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34979323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档