JavaScript可在chrome控制台上运行,但不能在Firefox或硒代码中运行

时间:2019-10-31 11:26:21

标签: python selenium xpath iframe webdriverwait

我正在尝试使用selenium自动登录到以下页面: https://services.cal-online.co.il/Card-Holders/SCREENS/AccountManagement/Login.aspx?ReturnUrl=%2fcard-holders%2fScreens%2fAccountManagement%2fHomePage.aspx

尝试同时使用id,css选择器和xpath查找用户名和密码的元素。

self._web_driver.find_element_by_xpath('//*[@id="txt-login-username"]')
self._web_driver.find_element_by_id("txt-login-password")
self._web_driver.find_element_by_css_selector('#txt-login-username')

对于这三者,我都会收到NoSuchElement异常

我尝试了以下JS脚本:document.getElementById('txt-login-username') 当我在selenium或firefox中运行此脚本时,它返回Null 但是当我在chrome控制台中运行它时,我得到了可以使用的结果。 有什么方法可以使它从python代码运行,或者在chrome控制台本身而不是从python execute_script运行?

2 个答案:

答案 0 :(得分:1)

要使用page自动登录Selenium,因为所需元素位于<iframe>中,因此您必须:

  • 诱导 WebDriverWait 以使所需的框架可用并切换到它。
  • 诱导 WebDriverWait 以使所需的元素可点击
  • 您可以使用以下解决方案:

    • 代码块:

      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
      
      options = webdriver.ChromeOptions()
      options.add_argument("start-maximized")
      driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get("https://services.cal-online.co.il/Card-Holders/SCREENS/AccountManagement/Login.aspx?ReturnUrl=%2fcard-holders%2fScreens%2fAccountManagement%2fHomePage.aspx")
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='calconnectIframe']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='txt-login-username']"))).send_keys("ariel6653")
      driver.find_element_by_xpath("//input[@id='txt-login-password']").send_keys("ariel6653")
      

浏览器快照:

cal-online

  

在这里您可以找到有关Ways to deal with #document under iframe的相关讨论

答案 1 :(得分:0)

找到了解决问题的方法。问题确实是该对象位于iframe中。 我尝试使用Get element from within an iFrame

中建议的解决方案

,但出现安全错误。解决方案是按照以下方式切换框架: driver.switch_to.frame("iframe") 现在您可以使用普通的查找元素