所以我尝试使用 selenium 来自动完成一些表单,但我遇到了一个问题。我使用的其中一种表单不是由 HTML 立即加载的,而是在页面正常加载后使用 JavaScript 加载的。无论出于何种原因,selenium 在 javascript 中加载后都无法看到页面的更新源。例如,如果我运行以下代码。
browser = webdriver.Firefox()
browser.get('https://examplepage.com')
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.ID, “13jres”))).send_keys(“email@email.com”)
没有任何反应并且超时。在做了一些测试后,我注意到如果我使用以下代码在 python 中打印源代码
browser = webdriver.Firefox()
browser.get('https://examplepage.com')
time.sleep(20)
print browser.page_source
然后源代码与我可以在selenium firefox实例中手动查看的源代码不同。因此,根据 selenium 源输出,我试图输入的下一行不存在,即使在 firefox 中检查元素或在 Firefox 中查看已加载内容的源实例时它显然在那里使用 Selenium 。
<input label=“Email” type="text" name="13jres" id="13jres" class="text-field”>(shortened to make it more readable)
在阅读一些文档时,我在引用 page_source 命令时发现了这个花絮,我想这解释了来源的差异,但我仍然不清楚如何通过在页面上找到这些元素来缓解我的问题。我在 selenium(safari、chrome 等)中尝试过其他浏览器,但除此之外,我不太确定我需要做什么。
“如果页面在加载后被修改(例如,通过 Javascript),则无法保证返回的文本是修改后页面的文本。请查阅所使用的特定驱动程序的文档,以确定返回的文本是否反射(reflect)了页面的当前状态或网络服务器上次发送的文本。”
最佳答案
正如您提到的Nothing happens and it times out.
这实质上意味着它可以是以下任一情况:
<input>
标签:根据您提供的缩短的 HTML:<input label=“Email” type="text" name="13jres" id="13jres" class="text-field”>(shortened to make it more readable)
由于缩短了标记,我们无法理解
<input>
是否标签有任何onClick()
事件是否与之关联。接下来您将尝试:
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.ID, “13jres”))).send_keys(“email@email.com”)
我们是否正在调用
send_keys()
仍然没有定论是否在右边的 webelement 上。Locator Strategy
: 根据您的代码试用,您已尝试使用基于id
的定位器策略 .但是id
属性被设置为值 13jres 对我来说看起来是动态的。因此,您可以更细化并适应更有效的Locator Strategy
如下:WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, “input.text-field[id$='jres']”))).send_keys(“email@email.com”)
您可以在 Official locator strategies for the webdriver 中找到关于定位器策略的详细讨论。
关于javascript - Selenium 查找稍后通过 javascript 加载的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48778961/