我在 Selenium 中找不到元素。(蟒蛇/谷歌)

I can't find an element in Selenium.(Python/Google)

提问人:SauloSouzaw 提问时间:8/27/2020 更新时间:9/4/2020 访问量:378

问:

这是链接 https://webmail1.hostinger.com/

我想找到 2 个输入框并输入我的电子邮件和密码,但我无法访问它们。我可以通过检查页面轻松找到它们,但我无法通过它们的 xpath、选择器、id 等找到它们。

我认为它们可能在框架内,但我在页面中访问了框架,但无济于事。

我还尝试插入一个等待期,以防有东西要加载,但这并没有解决问题。 以下是我的代码的相关部分目前的情况:

driver.execute_script("window.open('https://webmail1.hostinger.com/');)
sleep(10)

iframes = driver.find_elements_by_tag_name("iframe")
driver.switch_to.frame(iframes[0])

element = WebDriverWait(driver, 30).until(
       EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div[1]/form/table/tbody/tr[1]/td[2]/input"))
    )

element.send_keys("test")

谢谢你的帮助

python selenium 网页抓取 chrome-web-driver

评论

0赞 rahul rai 8/27/2020
尽管页面中有一个框架,但您的元素不在 iframe 中。您只需要识别元素并输入文本。尝试将 Id 作为其唯一值,并显示两个文本框。

答:

0赞 Taha Rind 8/27/2020 #1

“execute_script”是一种 JavaScript 方法,它用于查找用户可能无法访问的元素,用于查找元素而不打开网站。我还找到了输入框的 id。

请改用 driver.get(URL)

from selenium import webdriver

driver = webdriver.Chrome("location of webdriver")
URL ='https://webmail1.hostinger.com/'

driver.get(URL)

driver.find_element_by_id('rcmloginuser').send_keys('your username')
driver.find_element_by_id('rcmloginpwd').send_keys('your password')
0赞 Arundeep Chohan 8/27/2020 #2

如果你想去一个URL并获取id并在python中提交,你应该做这样的事情。您的标签不在 iframe 中,我们使用 webdriver waits 而不是 time.sleep()

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

driver = webdriver.Chrome("location of webdriver")
URL ='https://webmail1.hostinger.com/'

driver.get(URL)

WebDriverWait(driver, 30).until(
 EC.presence_of_element_located(By.ID('rcmloginuser'))).send_keys('your username')

WebDriverWait(driver, 30).until(
 EC.presence_of_element_located(By.ID('rcmloginpwd'))).send_keys('your pass')

WebDriverWait(driver, 30).until(
 EC.presence_of_element_located(By.CLASS_NAME('button mainaction submit'))).click()
0赞 EDZ 8/27/2020 #3

按 ID 查找元素应该有效。如果您需要等待页面加载,可以使用EC.presence_of_element_located。不要设置硬编码的等待时间。

   ` try:
        element_present = EC.presence_of_element_located((By.ID, 'rcmloginuser'))
        WebDriverWait(driver, timeout).until(element_present)
        user_name = driver.find_element_by_id('rcmloginuser')
        pass_word = driver.find_element_by_id('rcmloginpwd')
        user_name.send_keys(user)
        pass_word.send_keys(password)
        submit_1 = driver.find_element_by_id('rcmloginsubmit h_webmail-login_page-login_button')
        submit_1.click()
    except TimeoutException:
        sys.exit(1) `
0赞 SauloSouzaw 9/4/2020 #4

重要提示:如果您在打开新选项卡后无法打开元素,请检查此答案。这是我的问题*

72 次尝试,大约 5 小时后,我终于找到了答案。 上面的答案都没有帮助我,也许是因为我不够清楚。

基本上,我的代码的第一部分打开了一个窗口,插入了密码、电子邮件等,一切顺利。 然后,我打开了一个新选项卡>(这里有人声称是 Javascript。可能是,但它绝对也是 python 中的命令。

driver.execute_script("window.open('https://webmail1.hostinger.com/');)

我尝试从这个已打开的新选项卡中查找元素,但您需要告诉 webdriver 切换到新选项卡。我以为只有打开它就足以让 webdriver 自动连接到它。 基本上,我在选项卡 2 的 html 中搜索选项卡 1 的元素,这就是我没有找到它们的原因。 这是我现在的代码:

#opens new tab
driver.execute_script("window.open('https://webmail1.hostinger.com/');")
#switches to the second tab 
driver.switch_to.window(driver.window_handles[1])
driver.get(tab_url)

email= driver.find_element_by_name('_user')
email.send_keys("my_email")

password = driver.find_element_by_id("rcmloginpwd")
password.send_keys("my_password")

它就像一个魅力。 这是我找到的关于这个的链接。去那里获取更多信息