这里完全是新手。我正在自动化用于"不符合"票的表单,并且我正在成功地填充所有文本字段,除了一个。问题是,我没有收到任何错误信息。代码一直到最后,但留下一个文本字段为空。该文本框是票据的主体,用于描述问题,因此我无法绕过不使用它的方法。
下面是我最初写的代码:
print(desc_to_write) #Use while debuggin this to confirm the variable contain the string.
desc = web.find_element_by_xpath('/html/body')
desc.send_keys(desc_to_write)
#No error but still nothing in the browser text field.
xpath是我用Chrome的"复制xpath"工具得到的。
我也尝试了以下方法,但没有成功(相关的注释是收到的错误)。
# 1:
desc = web.find_element_by_class_name('editor_body')
desc.send_keys(desc_to_write)
#selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".editor_body"}
# 2:
desc = web.find_element_by_css_selector('body.editor_body')
desc.send_keys(desc_to_write)
#NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"body.editor_body"}
# 3:
desc = web.find_element_by_xpath('/html/body')
desc.click()
time.sleep(5)
desc.send_keys(desc_to_write)
#No error but still nothing in the browser text field.
#4:我也尝试过完整的Xpath,但没有成功。我不得不自己猜测完整路径,因为"复制完整Xpath"工具将返回与上面相同的路径。我使用"iframe"的Xpath并添加"/html/body"获得了大部分路径。请注意,我对HTML一无所知,所以我可能在某个地方犯了错误。这是一次绝望的尝试。
desc = web.find_element_by_xpath('//*[@id="NewRequestTab"]/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr[1]/td/table/tbody/tr[14]/td[2]/div/iframe/html/body')
desc.send_keys(desc_to_write)
结果错误是:
#selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="NewRequestTab"]/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr[1]/td/table/tbody/tr[14]/td[2]/div/iframe/html/body"} (Session info: chrome=88.0.4324.104)
我还附上了在Chrome的开发人员工具中看到的代码的屏幕截图。我可以复制实际的代码,但老实说,我知道HTML是如何工作的,我不知道什么是相关的。如果需要,我可以提供更多。突出显示的部分是Chrome开发工具中的检查器工具的结果。
谢谢你的帮助!
HTML代码
您必须切换到iframe,以便将其内容与selenium一起使用。最好的方法是先等待它出现,然后切换:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 300)
wait.until(EC.frame_to_be_available_and_switch_to_it(driver.find_element(By.CLASS_NAME, 'textarea')))
我根据John的回答做了一些研究,发现了以下类似问题的答案。然后我想到了
web.switch_to.frame(web.find_element_by_xpath('//*[@id="NewRequestTab"]/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[1]/td/table/tbody/tr[1]/td/table/tbody/tr[14]/td[2]/div/iframe'))
desc = web.find_element_by_class_name('editor_body')
desc.click()
desc.send_keys(desc_to_write)
web.switch_to.default_content()
现在一切都好。谢谢!