selemium press' ARROW DOWN'在一个盒子里

时间:2017-02-21 01:19:40

标签: python python-3.x selenium selenium-webdriver

我在这个网站上尝试了硒:http://www.panachocolate.com/stockists

您可以看到左侧有一个地址列表。默认情况下,它列出100个地址。如果我想看到更多,我需要向下滚动框到最后一个触发更多地址'事件。我觉得这很简单,只有2-3步:

  1. 找到该地址栏

  2. 也许点击它?

  3. 按下箭头按钮。

  4. 所以,有了这个想法,我想出了以下代码(不工作):

    from selenium.webdriver.common.keys import Keys
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('http://www.panachocolate.com/stockists?')
    elem = driver.find_element_by_xpath('//ol[@class="storeList rounded-
    list"]')
    elem.click()
    elem.send_keys(Keys.ARROW_DOWN)
    # Keys.PAGE_DOWN, Keys.SPACE also won't work
    

    它会为“点击”提供错误。和' send_keys方法':' ElementNotVisibleException:元素不可见'。我选择了错误的元素吗?但那里没有其他元素。我也尝试了最后一个地址元素' // li [@ data-value =" 99"]'但是没有工作。谁知道我错过了什么?有什么建议吗?

    环境:Ubuntu,python3

2 个答案:

答案 0 :(得分:1)

我不确定python中的代码,但我可以对你正在寻找的方法给出一个公平的想法。

使用Action类执行滚动或移动滚动条。 Java中的代码如下所示。

Actions move = new Actions(driver);
move.moveToElement(draggablePartOfScrollbar).clickAndHold().‌​moveByOffset(0,numbe‌​rOfPixelsToDragTheSc‌​rollbarDown).release‌​().perform();

或者

 WebElement slider = driver.findElement(By.xpath('//ol[@class="storeList rounded-
list"]'));
 Actions move = new Actions(driver);
     Action action = (Action) move.dragAndDropBy(slider, 30, 0).build();
    action.perform();

或者

Actions move = new Actions(driver);
//here you specify the condition for the scrolling length 
move.moveToElement(slider).click(slider).sendKeys(Keys.ARROW_DOWN).perform();

道歉,我无法用Python提供确切的代码,但这种方法可以帮到你。

请告诉我,如果它不起作用,我会尝试在java中实现它并发布代码。

答案 1 :(得分:0)

所以,受到@Dharam的启发,我在python中找到了解决方案。拖动滚动条,它的工作原理!请注意我将浏览器驱动程序从Firefox更改为Chrome,因为似乎firefox在处理动作链方面存在一些问题。

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Chrome()
driver.get('http://www.panachocolate.com/stockists?')

while True:
    try:
        # keep dragging till the last address show up
        driver.find_element_by_xpath('//li[@ data-value="2434"]')
        break
    except NoSuchElementException:
        actions = ActionChains(driver)
        # grab the sliding bar
        source = driver.find_element_by_xpath('//div[@class="jspDrag"]')
        # grab any element at the bottom of page 
        target = driver.find_element_by_xpath('//div[@class="footer-container"]')
        # drag, drag, drag....
        actions.drag_and_drop(source,target).perform()
        time.sleep(1)