我正在尝试使用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运行?
答案 0 :(得分:1)
要使用page自动登录Selenium,因为所需元素位于<iframe>
中,因此您必须:
您可以使用以下解决方案:
代码块:
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")
浏览器快照:
在这里您可以找到有关Ways to deal with #document under iframe的相关讨论
答案 1 :(得分:0)
找到了解决问题的方法。问题确实是该对象位于iframe中。 我尝试使用Get element from within an iFrame
中建议的解决方案,但出现安全错误。解决方案是按照以下方式切换框架:
driver.switch_to.frame("iframe")
现在您可以使用普通的查找元素