使用selenium(python)捕获登录窗口中的电子邮件框

使用selenium(python)捕获登录窗口中的电子邮件框,selenium,selenium-webdriver,Selenium,Selenium Webdriver,网址: 在这种情况下,我想抓住邮箱 我试过了 tem = driver.find_element_by_id('user') tem = driver.find_element_by_name('user') tem = driver.find_element_by_class_name('ie-background background') tem = driver.find_element_by_xpath('//input[@id="user"]') Selenium报告了相同类型的错误

网址: 在这种情况下,我想抓住邮箱

我试过了

tem = driver.find_element_by_id('user')
tem = driver.find_element_by_name('user')
tem = driver.find_element_by_class_name('ie-background background')
tem = driver.find_element_by_xpath('//input[@id="user"]')
Selenium报告了相同类型的错误:无法定位元素

如果我单击inspection,我可以找到HTML代码

<input type="text" name="user" id="user" size="30" class="ie-background background" tabindex="1" autocomplete="off"> 


但是,当我单击“查看源代码”时,它会给我一个不同的HTML代码,而该源代码中只包含这段HTML代码,我想这可能就是selenium无法抓取电子邮件框的原因。

在我看来,登录表单在页面加载期间没有呈现,它在加载之后才出现。 您是否尝试等待呈现“email”元素

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

tem = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "email"))
    ) 

上面的代码将等待元素在页面中定位,或等待10秒(无论先发生什么)。

您需要切换到包含表单的iframe。这是密码

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


browser = webdriver.Chrome("C:\Py\pythonv4\chrome\chromedriver_2.42.exe")
browser.get('https://www.omgeo.com/login')
browser.switch_to.frame(0)
WebDriverWait(browser, 20).until(
  EC.presence_of_element_located((By.ID, "user"))
) 
browser.find_element_by_id('user').send_keys("test")

在检查元素时,我看到元素位于iframe内部。对于框架,正如其他人所说,我们需要在与框架内的任何元素交互之前切换到框架

此外,我们还需要切换回主内容以继续在主html中插入元素

通常,iframe中的内容需要一段时间才能加载。所以我们需要等待帧加载并切换到它

对于你的情况,下面的代码对我有效

从selenium导入webdriver
从selenium.webdriver.support.ui导入WebDriverWait
从webdriver_manager.chrome导入ChromeDriverManager
从selenium.webdriver.support将预期的_条件导入为EC
driver=webdriver.Chrome(ChromeDriverManager().install())
司机,上车https://www.omgeo.com/login')
wait=WebDriverWait(驱动程序,60)
等待.until(EC.presence\u所有元素的位置((By.CSS\u选择器'iframe[src$=login'))
驱动程序。通过id(“用户”)查找元素。发送密钥(“emailid”)
完成登录操作后,与主html dom交互。您需要切换回以下行

browser.switchTo().defaultContent();

注意:在上面的示例中,我使用webdriver manager自动安装chrome驱动程序二进制文件。有关详细信息,请参阅共享html,因为我不想访问该页面。谢谢,但我认为这不是问题所在

@SebaGra谢谢,我尝试了上面的代码。Selenium报告了“Selenium.common.exceptions.TimeoutException:Message:”即使在10秒或20秒之后,当您单击查看检查并查看源代码时,它仍然会为您提供两个不同版本的HTML代码,它们不在“查看源代码”版本中。