Selenium(Python)按id查找元素在schwab.com上不起作用

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

使用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_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上播放。。。去看他们。我以前甚至把它们和你联系在一起,所以我知道你见过它们。