【问题标题】:Unable to access textbox and button on specific website using Selenium WebDriver and Python无法使用 Selenium WebDriver 和 Python 访问特定网站上的文本框和按钮
【发布时间】:2019-03-17 09:41:07
【问题描述】:

我在 selenium 中迈出了第一步,现在正面临一个奇怪的问题。我想在网站上导航并在搜索框中输入文本,然后单击“输入”按钮进入下一页。一般来说,我知道如何做到这一点,并且它可以在其他网站上无缝运行,但这似乎会以某种方式造成麻烦。当我按名称搜索文本框和按钮时,它就是找不到它们。如果我尝试通过 xPath 或 ID 访问它们,同样的问题... 网址为:http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/(德国游泳协会数据库)

到目前为止,我的代码如下所示:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

url = "http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/"

driver = webdriver.Chrome()
driver.get(url)

submit_button = driver.find_element_by_name("_submitButton")
fistname_textbox = driver.find_element_by_xpath('//*[@id="_firstnameTextBox"]')
lastname_textbox = driver.find_element_by_xpath('//*[@id="_lastnameTextBox"]')
regid_textbox = driver.find_element_by_id("_regidTextBox")

fistname_textbox.send_Keys("String 1")
lastname_textbox.send_keys("String 2")
submit_button.click()

driver.close()

如果你们中的任何人可以帮助我并找出导致此问题的原因,我将非常感激 :) 我现在越来越困惑

【问题讨论】:

    标签: python selenium iframe webdriver webdriverwait


    【解决方案1】:

    您定位该元素的尝试未成功,因为它们嵌套在 iframe 中。在尝试单击它或以任何方式使用它之前,必须告诉 selenium 切换到包含所需元素的iframe。请尝试以下操作:

    from selenium import webdriver
    
    url = "http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/"
    
    driver = webdriver.Chrome()
    driver.get(url)
    driver.switch_to.frame(0);
    submit_button = driver.find_element_by_name("_submitButton")
    fistname_textbox = driver.find_element_by_xpath('//*[@id="_firstnameTextBox"]')
    lastname_textbox = driver.find_element_by_xpath('//*[@id="_lastnameTextBox"]')
    regid_textbox = driver.find_element_by_id("_regidTextBox")
    
    fistname_textbox.send_keys("String 1")
    lastname_textbox.send_keys("String 2")
    submit_button.click()
    
    driver.close()
    

    【讨论】:

      【解决方案2】:

      all部分在<iframe>标签内,你需要先切换到它

      from selenium.webdriver.support import expected_conditions as ec
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      
      wait = WebDriverWait(driver, 5)
      wait.until(ec.frame_to_be_available_and_switch_to_it((By.TAG_NAME, 'iframe')))
      
      submit_button = driver.find_element_by_name("_submitButton")
      #...
      

      【讨论】:

      • 感谢您的解决方案,但我收到一条错误消息:wait.until(ec.frame_to_be_available_and_switch_to_it(By.TAG_NAME, 'iframe')) TypeError: __init__() 接受 2 个位置参数,但给出了 3 个
      • @juliu_mbr 试试wait.until(ec.frame_to_be_available_and_switch_to_it((By.TAG_NAME, 'iframe'))) 和双(())
      【解决方案3】:

      文本框和按钮元素在<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')
          options.add_argument('disable-infobars')
          options.add_argument('--disable-extensions')
          driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
          driver.get("http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/")
          WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[@src='https://dsvdaten.dsv.de/Modules/Results/Individual.aspx?Lang=de-DE']")))
          WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='TextBox' and @id='_firstnameTextBox']"))).send_keys("juliu_mbr")
          driver.find_element_by_xpath("//input[@class='TextBox' and @id='_lastnameTextBox']").send_keys("juliu_mbr")
          driver.find_element_by_xpath("//input[@class='Button' and @id='_submitButton']").click()
          
      • 浏览器快照:

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

      【讨论】:

        【解决方案4】:

        你需要切换到frame,然后定位元素

        url = "http://www.dsv.de/schwimmen/wettkampf-national/schwimmerabfrage/"
        
        driver = webdriver.Chrome()
        driver.get(url)
        driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@src='https://dsvdaten.dsv.de/Modules/Results/Individual.aspx?Lang=de-DE']'));
        
        // then your code for the Login
        
        submit_button = driver.find_element_by_name("_submitButton")
        fistname_textbox = driver.find_element_by_xpath('//*[@id="_firstnameTextBox"]')
        lastname_textbox = driver.find_element_by_xpath('//*[@id="_lastnameTextBox"]')
        regid_textbox = driver.find_element_by_id("_regidTextBox")
        
        fistname_textbox.send_Keys("String 1")
        lastname_textbox.send_keys("String 2")
        submit_button.click()
        
        driver.close()
        

        【讨论】:

          猜你喜欢
          • 2022-12-14
          • 1970-01-01
          • 2021-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-17
          • 1970-01-01
          • 2018-09-27
          相关资源
          最近更新 更多