Selenium(Python)按id查找元素在schwab.com上不起作用
使用Selenium(通过Python),我试图找到的“登录”按钮。 按钮是button类型的元素,id='loginSubmitButton'。 我正在使用以下代码:Selenium(Python)按id查找元素在schwab.com上不起作用,python,selenium,google-chrome,Python,Selenium,Google Chrome,使用Selenium(通过Python),我试图找到的“登录”按钮。 按钮是button类型的元素,id='loginSubmitButton'。 我正在使用以下代码: from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get("http://schwab.com") driver.implicitly_wait(10) driver.find_element_b
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://schwab.com")
driver.implicitly_wait(10)
driver.find_element_by_id("loginSubmitButton")
driver.close()
浏览器可以正确打开页面,并且按钮可以验证(使用Chrome开发工具),但是Selenium无法找到它
我尝试过这段代码的许多变体,包括使用WebDriverWait,但似乎没有任何效果
非常感谢您的建议。使用xpath查找元素比使用id查找元素更有效。 你可以试着用这个 登录表单也显示在iframe上。 您需要切换到iframe以单击该按钮。 然后切换回默认设置,以便能够在帧外的其他元素上单击或执行操作 要切换到iframe,可以使用以下代码: 驱动程序切换到帧(iframe) 然后在这里使用您的点击按钮代码 要切换回默认内容,请使用此行: driver.switch_to.default_content()
这应该是可行的。使用按xpath查找元素比使用按id查找元素更有效。 你可以试着用这个 登录表单也显示在iframe上。 您需要切换到iframe以单击该按钮。 然后切换回默认设置,以便能够在帧外的其他元素上单击或执行操作 要切换到iframe,可以使用以下代码: 驱动程序切换到帧(iframe) 然后在这里使用您的点击按钮代码 要切换回默认内容,请使用此行: driver.switch_to.default_content()
这应该可以工作。您无法单击该按钮,因为登录表单位于
iFrame
下
所以首先需要切换到iframe,然后只有您才能访问这些元素
username_frame = driver.find_element_by_id('LoginComponentForm')
driver.switch_to.frame(username_frame)
driver.find_element_by_id("loginSubmitButton").click()
您无法单击该按钮,因为登录表单位于
iFrame
下
所以首先需要切换到iframe,然后只有您才能访问这些元素
username_frame = driver.find_element_by_id('LoginComponentForm')
driver.switch_to.frame(username_frame)
driver.find_element_by_id("loginSubmitButton").click()
由于所需元素位于
中,因此要在元素上调用单击()
,您必须:
- 诱导WebDriverWait以使所需帧可用并切换到该帧
- 诱导WebDriverWait使所需元素可单击
- 您可以使用以下任一选项:
- 使用
:CSS\u选择器
from selenium import webdriver 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.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe') driver.get('https://www.schwab.com/') WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#LoginComponentForm"))) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span#LoginText"))).click()
- 使用
:XPATH
from selenium import webdriver 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.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe') driver.get('https://www.schwab.com/') WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='LoginComponentForm']"))) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@id='LoginText']"))).click()
- 使用
参考
在这里,您可以找到有关的相关讨论,因为所需元素位于
中,因此要在元素上调用单击()
,您必须:
- 诱导WebDriverWait以使所需帧可用并切换到该帧
- 诱导WebDriverWait使所需元素可单击
- 您可以使用以下任一选项:
- 使用
:CSS\u选择器
from selenium import webdriver 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.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe') driver.get('https://www.schwab.com/') WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#LoginComponentForm"))) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span#LoginText"))).click()
- 使用
:XPATH
from selenium import webdriver 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.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe') driver.get('https://www.schwab.com/') WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='LoginComponentForm']"))) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@id='LoginText']"))).click()
- 使用
参考
在这里,您可以找到关于的相关讨论。您能否详细说明为什么通过xpath查找元素比通过id查找元素更有效?使用xpath查找元素更适合查找具有复杂选择器的元素。尽管我没有检查那边是否有iframe,但您仍然没有解释XPath如何比ID更有效。坦率地说,如果您阅读了最佳实践,包括听取Selenium贡献者的意见,他们会告诉您XPath应该是您应该使用的最后一个定位器(如果有的话)。ID应该是第一个,紧跟在CSS选择器之后,最后一个是XPath。@JeffC您的评论有误导性,同时在学习Selenium的过程中起到了反作用。Selenium贡献者从未建议避免XPath,因为有时只有XPath可以使用。您需要仔细阅读文档。@DebanjanB我的评论既没有误导性,也没有适得其反。。。这是事实。如果您认为Selenium贡献者从未建议避免XPath,那么您显然从未听过Selenium贡献者的任何谈话。他们在赛琳纽姆孔夫和索塞康这样的会议上总是这么说。我知道。。。我参加了会议,直接听到了他们的谈话。视频在yt上播放。。。去看他们。我以前甚至将它们链接到过您,所以我知道您已经看到了它们。您能否详细说明为什么通过xpath查找元素比通过id查找元素更有效?使用xpath查找元素更适合查找具有复杂选择器的元素。尽管我没有检查那边是否有iframe,但您仍然没有解释XPath如何比ID更有效。坦率地说,如果您阅读了最佳实践,包括听取Selenium贡献者的意见,他们会告诉您XPath应该是您应该使用的最后一个定位器(如果有的话)。ID应该是第一个,紧跟在CSS选择器之后,最后一个是XPath。@JeffC您的评论有误导性,同时在学习Selenium的过程中起到了反作用。Selenium贡献者从未建议避免XPath,因为有时只有XPath可以使用。您需要仔细阅读文档。@DebanjanB我的评论既没有误导性,也没有适得其反。。。这是事实。如果您认为Selenium贡献者从未建议避免XPath,那么您显然从未听过Selenium贡献者的任何谈话。他们在赛琳纽姆孔夫和索塞康这样的会议上总是这么说。我知道。。。我参加了会议,直接听到了他们的谈话。视频在yt上播放。。。去看他们。我以前甚至把它们和你联系在一起,所以我知道你见过它们。