【问题标题】:click() works in Chrome but not Firefox?click() 适用于 Chrome 但不适用于 Firefox?
【发布时间】:2015-06-09 07:34:24
【问题描述】:

我想打开一个网站并点击一个按钮,所以我写了以下代码:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('http://python.org')
elem = driver.find_element_by_id("downloads")
elem.click()

代码使用给定的 url 打开 Firefox。它通过它的 id 名称找到按钮,然后单击它。

现在的问题是,它在 Firefox 中无法正常工作。当我点击上述网站的下载按钮时,我的 Firefox 中将打开一个新链接。但是当代码被执行时,它不是像我那样点击按钮,更像是在“选择”按钮而不是点击它。

奇怪的是,上面的代码在 Chrome 中可以完美运行:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://python.org')
elem = driver.find_element_by_id("downloads")
elem.click()

点击下载按钮,然后在 Chrome 中打开一个新链接。

我想知道,有什么问题?为什么代码可以在 Chrome 上运行,但不能在 Firefox 上运行?

顺便说一句,我正在运行 Windows 7 64 位和 Python 2.7 32 位。我的浏览器版本是 Firefox 36 和 Chrome 41。

【问题讨论】:

    标签: python google-chrome firefox selenium selenium-webdriver


    【解决方案1】:

    我看到有一个子节点,您尝试单击的元素的锚标记。您需要单击锚标记以导航到链接。下面的代码对我有用

    driver.find_element_by_css_selector("#downloads a").click()
    

    【讨论】:

    • 与 ChromeDriver 相比,这实际上似乎是 FirefoxDriver 中的 css 选择器不准确的问题。以这种方式为我工作。
    【解决方案2】:

    这似乎对我有用。请尝试:

    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('http://python.org')
    elem = driver.find_element_by_link_text("Downloads")
    elem.click()
    

    对于 chrome:

    from selenium import webdriver
    
    driver = webdriver.Chrome("res/chromedriver.exe")
    driver.get('http://python.org')
    elem = driver.find_element_by_link_text("Downloads")
    elem.click()
    

    【讨论】:

      【解决方案3】:

      等待Downloads链接变为可点击移动到元素然后点击:

      wait = WebDriverWait(driver, 10)
      downloads = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Downloads")))
      
      ActionChains(driver).move_to_element(downloads).click().perform()
      

      在 Chrome 和 Firefox 中都适用。

      【讨论】: