包含在一个动态页面中的网页,无法使用与Selenium(Python)的驱动程序交互

2024-04-26 02:31:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在测试的web应用程序的主页在您第一次加载它时有一个加载屏幕,然后会出现一个用户名/密码框。它是一个动态生成的UI元素,游标默认位于username字段内。你知道吗

我环顾四周,有人建议使用行动链。当我使用动作链时,我可以立即在username和password字段中输入文本,然后按enter键,下一页就可以加载了。不幸的是,由于我的特殊设置,行动链不是一个可行的长期答案。你知道吗

当我使用webdriver的find_element_by_id时,我能够找到它,但是我不能send_keys到元素,因为它是不可见的。我收到

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible.

我也不能点击该字段或以其他方式与之交互而不出现此错误。你知道吗

我也尝试过通过其他方式识别和交互元素,比如“xpath”和css,但都没有效果。它们总是not visible。你知道吗

奇怪的是,它适用于动态页面标题。页面第一次加载时为Loading...,完成时为Login。当调用driver.title时,驱动程序将返回当前标题。你知道吗

有人有什么建议吗?你知道吗


Tags: web应用程序元素标题屏幕方式usernamenot
2条回答

正如saurabh所建议的,使用 1自己等着(EC.元素的可见性((By.CSS\u选择器, 或.Sub\u类别)))你知道吗

否则就睡一觉吧,但是不建议使用它,可能是您在页面加载时更改的xpath

实际上,如果登录页中出现了加载进度条,您应该尝试使用^{}等待元素变为可见,如下所示:-

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

wait = WebDriverWait(driver, 10)

element = wait.until(EC.visibility_of_element_located((By.ID, "enter element id here")))

# now use send_keys
element.send_keys("enter value here")

Edited1:-如果您得到TimeoutException,我建议您尝试等待,然后使用WebDriverWait而不是硬编码的sleep wait加载进度条,找到不可见的元素,然后按如下所示查找desire元素:-

wait = WebDriverWait(driver, 10)

wait.until(EC.invisibility_of_element_located((By.ID, "enter loading progress bar  id or other locators here")))

#now after invisible of loading progress bar wait for desire element 
element = wait.until(EC.presence_of_element_located((By.ID, "enter element id here")))

# now use send_keys
element.send_keys("enter value here")

Edited2:-实际上presence_of_element_located元素只检查DOM上是否存在元素,而visibility_of_element_located检查存在和可见元素,这意味着presence_of_element_located还可以找到隐藏元素和可见元素,而可见性只可见,这就是presence_of_element_located工作的原因。你知道吗

现在的问题是在send_keys期间,因为硒在元素不可见之前是不可能在元素内部的,这就是为什么你会有麻烦的原因,可能是欲望元素上有一些隐藏的CSS工作,这使得它不可见,这就是为什么硒不能与它交互,但不用担心,你仍然可以使用execute_script设置值。你知道吗

现在您可以尝试在元素查找之后设置输入元素的值,而不是使用send_keys,如下所示:

driver.execute_script("arguments[0].value = arguments[1]", element, "enter your value here")

相关问题 更多 >