Selenium XPath 查找 gif 以单击

Selenium XPath finding gif to click

我无法单击网站上定义为动画格式 (.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)

有几个问题。首先,您需要等待图像加载。其次,由于某种原因,正常的 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)

可能是这种情况,您只需要偏移您尝试单击图像的位置,这是动作链允许的。

好的,我通过 ActionChains class -

搞定了
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