javascript - Selenium 查找稍后通过 javascript 加载的元素

标签 javascript python html selenium

所以我尝试使用 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/

相关文章:

javascript - 如何替换html5中的输出文本框?

html - 从移动设备查看时显示另一个页面

html - Angular ng-选项添加图标

javascript - 获取没有 DOM 元素的 css 值

javascript - 顺风 CSS 导航栏

javascript - 为什么我在 Firefox 中找不到错误来源

javascript - 如何定义一个包含方法并可以由 `ng-click` 调用的 Angular Directive(指令)?

python - 非 ASCII Python 标识符和反射率

python - 如何使用 GeoPandas 绘制多个图层

Python将项目添加到元组