我在这个网站上尝试了硒:http://www.panachocolate.com/stockists?
您可以看到左侧有一个地址列表。默认情况下,它列出100个地址。如果我想看到更多,我需要向下滚动框到最后一个触发更多地址'事件。我觉得这很简单,只有2-3步:
找到该地址栏
也许点击它?
按下箭头按钮。
所以,有了这个想法,我想出了以下代码(不工作):
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
答案 0 :(得分:1)
我不确定python中的代码,但我可以对你正在寻找的方法给出一个公平的想法。
使用Action类执行滚动或移动滚动条。 Java中的代码如下所示。
Actions move = new Actions(driver);
move.moveToElement(draggablePartOfScrollbar).clickAndHold().moveByOffset(0,numberOfPixelsToDragTheScrollbarDown).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)