Selenium似乎无法找到并点击网站上的按钮? - Python

时间:2015-06-16 16:07:14

标签: python selenium selenium-webdriver find element

我正在尝试制作自动从fiverr.com网站为我收集数据的软件。

它搜索特定字词,然后按下页面末尾的LOAD MORE按钮,并一直点击它,直到它加载所有“gig”#。

无论如何,我很清楚如何让它一直点击,直到所有内容都被加载,但我似乎甚至无法点击它。

这是我选择按钮并单击它的代码:

driver.find_element_by_xpath('//*[@class="btn-standard-lrg btn-white"]').click()

我不断收到以下错误:

  

元素目前不可见,因此可能无法与

进行交互

如果您转到:fiverr gig url并向下滚动,则可以看到LOAD MORE按钮。

3 个答案:

答案 0 :(得分:2)

首先,使用“面向布局”或“面向设计”的类btn-standard-lrgbtn-white是一种不好的做法。

相反,有一个方便的定位器"by link text",使用它:

load_more = driver.find_element_by_link_text("LOAD MORE")

请注意它的可读性和简单性。

您可能还需要wait until the "Load More" button would become visible

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
load_more = wait.until(EC.visibility_of_element_located((By.LINK_TEXT, 'LOAD MORE')))

并且,这里是完整的代码,点击“加载更多”,直到它变得不可见,这意味着所有帖子都被加载:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException


driver = webdriver.Chrome()  # or webdriver.Firefox()
driver.get("https://www.fiverr.com/search/gigs?utf8=%E2%9C%93&search_in=everywhere&source=top-bar&query=explainer%20video&page=1&layout=lists&filter=new")

wait = WebDriverWait(driver, 10)
while True:
    try:
        load_more = wait.until(EC.visibility_of_element_located((By.LINK_TEXT, 'LOAD MORE')))
    except TimeoutException:
        break

    load_more.click()

for item in driver.find_elements_by_css_selector("div.gig-item h3 a.gig-link-main"):
    print item.text.strip()

答案 1 :(得分:0)

这似乎是一个问题,因为您正在尝试与页面中不可见的元素进行交互(您需要向下滚动到页面底部以使其可视化)...

尝试做这样的事情:

element = driver.find_element_by_xpath('//*[@class="btn-standard-lrg btn-white"]')

location = element.native.location[:y]

execute_script("window.scrollTo(0, #{location})")

element.click

或在点击滚动到页面底部之前:

execute_script("window.scrollTo(0, 10000)")

答案 2 :(得分:0)

在网站上看到一些jiggery-pokery似乎正在进行中。根据经验,我建议:

一般:

  1. 请勿屏蔽来自第三方网站的信息。如果他们更改了您的代码将破坏的网站 - 也许可以联系该网站以查看他们是否有API?
  2. 始终使用PageObject模式,因为它会让您的代码保持干净(想想组件而不是“页面”)。
  3. 具体:

    1. 首先尝试选择父元素,然后逐步确定所需的元素。这通常会引发您的问题。
    2. 如果您没有在selenium中配置任何自动重试,则可以在元素可见之前运行该代码。正如你从错误信息中看到的那样,元素就在那里它只是不可见(我有硒的经验,但很少有python,所以无法帮助你:-()。