Python2.7+Selenium解析器Chrome正常,Firefox中find_element_by_name报错求助
Hey there, let's work through this frustrating issue where your Selenium script works smoothly in Chrome but fails on the first find_element_by_name("userId") call in Firefox 58. I've dealt with similar cross-browser quirks before, so here are actionable steps to fix it:
1. Verify Geckodriver-Firefox Compatibility
Firefox and Geckodriver have strict version matching rules, and this is the most common culprit here. Firefox 58 requires Geckodriver v0.20.0 (or a very close version) — newer Geckodriver versions might not play nice with Python 2.7 or Firefox 58.
- Check your current Geckodriver version by running:
geckodriver --version - If it's not v0.20.0, download the compatible version and replace the one in
/usr/local/bin. Make sure to restart your script after updating.
2. Add Explicit Wait for Element Rendering
Firefox often loads elements slower than Chrome, so calling find_element_by_name immediately after page load might catch the page before the "userId" element is fully rendered. Replace your direct element lookup with an explicit wait:
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 # Initialize Firefox driver driver = webdriver.Firefox() driver.get("your_target_url") # Wait up to 10 seconds for the userId element to exist in the DOM userId_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.NAME, "userId")) )
This ensures the script only tries to interact with the element once it's actually available.
3. Check for Iframe Nesting
If the "userId" form element is inside an <iframe> tag, Firefox won't find it unless you first switch to that iframe. Chrome might sometimes handle edge cases differently, but explicit switching is required for consistency:
# Switch to the target iframe (use id, name, or index if needed) iframe = driver.find_element_by_id("target_iframe_id") driver.switch_to.frame(iframe) # Now find the userId element userId_element = driver.find_element_by_name("userId") # After interacting with elements inside the iframe, switch back to the main page driver.switch_to.default_content()
Inspect your page source to confirm if the element is nested in an iframe.
4. Confirm Geckodriver Permissions
Even if Geckodriver is in /usr/local/bin, your user might lack execute permissions. Check with:
ls -l /usr/local/bin/geckodriver
If the permissions don't include an x (execute), fix it with:
sudo chmod +x /usr/local/bin/geckodriver
5. Explicitly Configure Firefox Binary (If Needed)
Sometimes Selenium can't locate the Firefox binary automatically. Specify it explicitly during driver initialization:
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary # Replace with your actual Firefox path (common paths: /usr/bin/firefox or /Applications/Firefox.app/Contents/MacOS/firefox) binary = FirefoxBinary("/usr/bin/firefox") driver = webdriver.Firefox(firefox_binary=binary)
Give these steps a try in order — the compatibility check and explicit wait are the most likely fixes here.
内容的提问来源于stack exchange,提问作者kksagar

