【问题标题】:Selenium XPath finding gif to clickSelenium XPath 找到要点击的 gif
【发布时间】:2018-07-27 15:49:25
【问题描述】:

我在单击网站上定义为动画格式 (.gif) 的所有按钮时遇到问题。我在 Selenium 中使用 XPath 来查找这些带有 id 的按钮,但脚本不会在这一行继续。如何通过查找所有 gif 来单击所有这些按钮?

我的脚本:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait


driver = webdriver.Firefox(executable_path=r'D:\geckodriver.exe')
driver.get("http://svtbilgi.dsi.gov.tr/Sorgu.aspx")
driver.find_element_by_id("ctl00_hld1_cbHavza").click()
Select(driver.find_element_by_id("ctl00_hld1_cbHavza")).select_by_visible_text("15. Kizilirmak Havzasi")
driver.find_element_by_id("ctl00_hld1_btnListele").click()
parent_handle = driver.current_window_handle
all_urls = []
all_images = driver.find_elements_by_xpath("//div[contains(@id,'OL_Icon')]/img")
for image in all_images :
     image.click()
     for handle in driver.window_handles :
          if handle != parent_handle:
              driver.switch_to_window(handle)
              WebDriverWait(driver, 15).until(lambda d: d.execute_script('return document.readyState') == 'complete')
              all_urls.append(driver.current_url)
              driver.close()
              driver.switchTo.window(parent_handle)

【问题讨论】:

  • 为什么在从下拉菜单中选择15. Kizilirmak Havzasi 后再次点击下拉菜单?
  • 是的,你是对的,我删除了它。但是我的问题呢?

标签: python selenium xpath gif


【解决方案1】:

好的,我通过 ActionChains 类解决了它 -

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

driver = webdriver.Chrome(executable_path=r'D:\Test automation\chromedriver.exe')
driver.get("http://svtbilgi.dsi.gov.tr/Sorgu.aspx")
driver.find_element_by_id("ctl00_hld1_cbHavza").click()
Select(driver.find_element_by_id("ctl00_hld1_cbHavza")).select_by_visible_text("15. Kizilirmak Havzasi")
driver.find_element_by_id("ctl00_hld1_btnListele").click()
parent_handle = driver.current_window_handle
driver.maximize_window()
all_urls = []
all_images = WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located((By.XPATH,"//div[contains(@id,'OL_Icon')]/img")))
print len(all_images)
for image in all_images :
     webdriver.ActionChains(driver).move_to_element(image).click(image).perform()
     for handle in driver.window_handles :
          if handle != parent_handle:
              driver.switch_to_window(handle)
              WebDriverWait(driver, 15).until(lambda d: d.execute_script('return document.readyState') == 'complete')
              all_urls.append(driver.current_url)
              driver.close()
              driver.switch_to.window(parent_handle)

print all_urls

【讨论】:

  • 我意识到不能提取所有网页,也可以将某些网站再次提取一次、两次或更多次。你如何解决这个问题?再次感谢。
【解决方案2】:

有几个问题。首先,您需要等待图像加载。其次,由于某种原因,普通的 selenium click() 方法似乎不起作用。相反,您可以使用动作链来执行点击。以下对我有用:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

driver = webdriver.Firefox(executable_path=r'D:\geckodriver.exe')
driver.get("http://svtbilgi.dsi.gov.tr/Sorgu.aspx")
driver.find_element_by_id("ctl00_hld1_cbHavza").click()
Select(driver.find_element_by_id("ctl00_hld1_cbHavza")).select_by_visible_text("15. Kizilirmak Havzasi")
driver.find_element_by_id("ctl00_hld1_btnListele").click()
parent_handle = driver.current_window_handle
all_urls = []

try:
    # Wait for images to load
    xpath = "//div[contains(@id,'OL_Icon')]/img"
    condition = EC.presence_of_all_elements_located((By.XPATH, xpath))
    all_images = WebDriverWait(driver, 20).until(condition)

except (TimeoutException, Exception):
    print('No images loaded.')
    all_images = []

for image in all_images:

    # Click image using action chain
    action = webdriver.common.action_chains.ActionChains(driver)
    action.move_to_element_with_offset(image, 5, 5)
    action.click()
    action.perform()

    for handle in driver.window_handles:
        if handle != parent_handle:
            driver.switch_to_window(handle)
            WebDriverWait(driver, 15).until(lambda d: d.execute_script('return document.readyState') == 'complete')
            all_urls.append(driver.current_url)
            driver.close()
            driver.switchTo.window(parent_handle)

            # Depending on your version of selenium, you may need this syntax:
            # driver.switch_to_window(parent_handle)

在这种情况下,您只需要在尝试单击图像的位置偏移,动作链将允许这样做。

【讨论】:

  • 感谢您的帮助,但在打开一个网站后停止。这个问题怎么解决?
  • 看不到你的评论,对不起,我刚把'driver.switchTo.window(parent_handle)'改成'driver.switch_to_window(parent_handle)',再次感谢。跨度>
  • 另外,添加了'from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.common.exceptions import TimeoutException'
  • 感谢您的收看!我更新了答案的完整性。
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 2023-03-06
  • 2013-12-15
  • 2015-02-23
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多