Python Can';不要从一些盒子状的容器中取出标题

Python Can';不要从一些盒子状的容器中取出标题,python,python-3.x,selenium,selenium-webdriver,web-scraping,Python,Python 3.x,Selenium,Selenium Webdriver,Web Scraping,我已经在python中编写了一个脚本,与selenium相关联,用于单击网页中地图上的一些可用点。单击一个点时,会弹出一个包含相关信息的小框 我想解析每个框的标题。当我执行脚本时,它在单击一个点时抛出一个错误。我怎样才能成功地开始 以下是脚本: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriver

我已经在
python
中编写了一个脚本,与
selenium
相关联,用于单击网页中地图上的一些可用点。单击一个点时,会弹出一个包含相关信息的小框

我想解析每个框的标题。当我执行脚本时,它在单击一个点时抛出一个错误。我怎样才能成功地开始

以下是脚本:

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

link = "replace with above link"

driver = webdriver.Chrome()
driver.get(link)
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#mapDiv_zoom_slider .esriSimpleSliderIncrementButton"))).click()
for item in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"#NWQMC_VM_directory_June2016_3915_0_layer circle"))):
    item.click()
我有一个错误:

line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Element <circle fill="rgb(237, 81, 81)" fill-opacity="1" stroke="rgb(153, 153, 153)" stroke-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" cx="720" cy="430" r="4" transform="matrix(1.00000000,0.00000000,0.00000000,1.00000000,0.00000000,0.00000000)" fill-rule="evenodd" stroke-dasharray="none" dojoGfxStrokeStyle="solid"></circle> is not clickable at point (720, 430). Other element would receive the click: <circle fill="rgb(20, 158, 206)" fill-opacity="1" stroke="rgb(153, 153, 153)" stroke-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" cx="720" cy="430" r="4" transform="matrix(1.00000000,0.00000000,0.00000000,1.00000000,0.00000000,0.00000000)" fill-rule="evenodd" stroke-dasharray="none" dojoGfxStrokeStyle="solid"></circle>
  (Session info: chrome=67.0.3396.99)
  (Driver info: chromedriver=2.36.540470 (e522d04694c7ebea4ba8821272dbef4f9b818c91),platform=Windows NT 6.1.7601 SP1 x86)
第242行,在check\u响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.WebDriverException:消息:未知错误:元素在点(720430)处不可单击。其他元素将收到单击:
(会话信息:chrome=67.0.3396.99)
(驱动程序信息:chromedriver=2.36.540470(E522D04694C7EBEA4BA8821272BEF4F9B818C91),平台=Windows NT 6.1.7601 SP1 x86)
这是一个盒子弹出的方式:


要回答您的特定问题,您不能像往常一样与
svg
元素交互。为此,您必须使用
xPath
,就像我在示例中提供的那样。此外,您不能像往常一样单击这些元素,但可以使用
ActionChains

wait = WebDriverWait(driver, 5)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#mapDiv_zoom_slider .esriSimpleSliderIncrementButton"))).click()
time.sleep(3)
items = driver.find_elements_by_xpath("//*[name()='svg']//*[name()='circle']")
i = 0
for item in items:
    try:
        time.sleep(1)
        ActionChains(driver).move_to_element(item).click(item).perform()
    except Exception:
        print("Can't click")
此代码起作用,将单击每个元素,直到地图被放大。在其中一个元素上,地图会放大,但在放大之后就不起作用了。为什么?我还没有发现,但你可以自己找到,或者问另一个问题,我们会尽力帮助你

注意:您必须添加一些导入:

from selenium.webdriver.common.action_chains import ActionChains
import time
编辑:我发现了问题,您必须在单击后关闭每个弹出窗口,然后它才能工作。工作代码如下:

wait = WebDriverWait(driver, 5)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mapDiv_zoom_slider .esriSimpleSliderIncrementButton"))).click()
time.sleep(3) # wait until all elements will be ready
items = driver.find_elements_by_xpath("//*[name()='svg']//*[name()='circle']")
for item in items:
    time.sleep(0.5) # small pause before each iteration
    ActionChains(driver).move_to_element(item).click(item).perform()
    wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@title = 'Close']"))).click()

我没有找到避免时间的方法。sleep(),可能在这种情况下是不可能的。

@Andrei Suvorkov非常接近(+1)

尝试以下代码以获得所需的输出:

from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get(link)
wait = WebDriverWait(driver, 5)
driver.maximize_window()

items = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//*[name()='svg']//*[name()='circle']")))
for item in items:
    ActionChains(driver).move_to_element(item).click(item).perform()
    popup = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "contentPane")))
    print(popup.text)
    wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@class, 'close')]"))).click()

这是我尝试使用您建议的脚本时遇到的一部分错误<代码>第397行,在_find_element返回驱动程序中。find_element(*by)TypeError:find_element()参数在*之后必须是可编辑的,而不是WebElement我已经编辑了我的答案,请查看并尝试代码段特定元素的问题已经解决,我已经在答案中添加了代码段非常感谢您的解决方案。部分有效(尚未解决)。在5/7次点击后,它抛出超时异常,指向最后一行。我刚刚在我的本地机器上测试了一次-工作正常。尝试增加
时间。睡眠(0.5)
时间。睡眠(1)
。我觉得剧本太快了太棒了!我不知道这个
WebDriverWait(弹出窗口,5)
。我以为这只是为了driver@AndreiSuvorkov哦事实上,这段代码是多余的),但是是的,如果你想在显式方式中使用相对XPath,你应该像
element=wait(driver,5)那样,直到(EC.visibility\u of_element\u located((By.XPath,“//node”)
另一个元素=wait(element,5)。直到(EC.visibility\u of_of_element\u located((By.XPath,“//另一个节点)))
我没有关闭我的电脑,只是因为我注意到你在@sir Andersson在线。只要你有空,就几乎没有失败的机会。谢谢。它做得很好。