python selenium,我无法从文本框中找到元素类或 id
Posted
技术标签:
【中文标题】python selenium,我无法从文本框中找到元素类或 id【英文标题】:python selenium, i can't find element class or id from a text box 【发布时间】:2022-01-21 22:25:14 【问题描述】:我需要一些帮助, 我尝试填写一个文本框 但是当我检查元素然后复制 xpath 它只给我
/body/html
然后,我尝试使用类名,但它不起作用
我该如何解决这个问题?
这是我的代码:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('link_to_the_website')
driver.find_element_by_xpath('/body/html').send_keys('hello world')
textboxes = driver.find_element_by_xpath('/html/body')
这是我检查文本框时的 html 代码
<body margin margin class="textarea from-control wysihtml5-editor placeholder" spellcheck="true" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); cursor: text; font-family: "Open Sans", sans-serif; font-size: 11px; font-style: normal; font-variant: normal; font-weight: 400; line-height: 16.5px; letter-spacing: normal; text-align: start; text-decoration: none solid rgb(0, 0, 0); text-indent: 0px; text-rendering: auto; word-break: normal; overflow-wrap: break-word; word-spacing: 0px;" contenteditable="true">type here......</body>
【问题讨论】:
您没有共享指向网页的链接,或者至少没有共享 HTML。你认为我们如何知道元素定位器? 好的,看看我的回答是否解决了你的问题 在该链接中,我们将看到几个文本框 - 您想将密钥发送到哪个文本区域? 页面中几乎所有的文本区域都在 iframe 内。但在不知道您想要的文本区域的情况下,只能猜测。 是的,然后我想在文本区域中填写或书写。有几个文本框。我要一个一个地填写。 【参考方案1】:-
您尝试访问的元素位于 iframe 中。
您应该使用显式等待
您的定位器错误...
这可能会更好:
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
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
driver.get('link_to_the_website')
wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"(//iframe)[1]")))
textarea = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "body.textarea")))
textarea.send_keys(your_text)
UPD 第二个文本区域在另一个 iframe 内,但由于这些不是嵌套的 iframe,为了从第一个 iframe 切换到第二个 iframe,您需要从第一个 iframe 切换到默认内容,然后切换到第二个 iframe。 通常,在您完成处理该 iframe 中的元素后切换到 iframe 后,您应该切换到默认内容。 因此,要将文本写入 2 个文本区域,您的代码可能是这样的:
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
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
driver.get('link_to_the_website')
wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"(//iframe)[1]")))
textarea1 = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "body.textarea")))
textarea1.send_keys(your_text1)
driver.switch_to.default_content()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"(//iframe)[2]")))
textarea2 = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "body.textarea")))
textarea2.send_keys(your_text2)
【讨论】:
先生,它真的很有效。!但仍然无法将第二个文本框填充到最后一个文本框。我尝试更改此值之前是“(//iframe)[1]”)变为“(//iframe)[2]”)。 wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"(//iframe)[2]"))) textarea2 = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, " body.textarea"))) textarea2.send_keys('your_text2') 这实际上是一个新的附加问题。请参阅我的更新答案。如果它解决了您的问题,请接受它 您提供的新代码,它确实有效。然后我开始了解它实际上是如何工作的。非常感谢你帮助我。! :)【参考方案2】:当您右键单击并检查元素时,请先尝试查看它是否有名称并相应地使用driver.find_element_by_name("")
。
如果没有名称可用,下一站应该是通过css-selector driver.find_element_by_css_selector("")
查找元素。
Xpath 通常是您最不想使用的东西。
顺便说一句,您提供的链接在我复制时确实有一个 xpath。应该是/html/body/div[3]/div[1]/div[2]/div/form/div[1]/div/input[1]
【讨论】:
是的,先生,但是当我尝试复制 xpath 或完整 xpath 时,将其粘贴。我刚得到/body/html/。我也已经尝试通过它的名称查找,但它也不起作用。以上是关于python selenium,我无法从文本框中找到元素类或 id的主要内容,如果未能解决你的问题,请参考以下文章