【问题标题】:Reload web source code without refreshing the page with Python Selenium使用 Python Selenium 重新加载 Web 源代码而不刷新页面
【发布时间】:2020-12-13 00:21:38
【问题描述】:

您好,请问有什么方法可以在不刷新页面的情况下刷新站点源代码。问题是当我加载页面http://107.170.101.241:8080/getTableColumn/ 并在那里放置一些信息时 - 您可以在下面的代码中看到,然后单击分析显示新的文本区域。我想从这个 textarea 中获取文本,但我不能,因为源代码是“旧的”并且 xpath 找不到它。最后一行代码是我要打印到控制台的内容。我尝试了 time.sleep 等,但没有任何帮助。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import time

chromedriver = "/usr/local/bin/chromedriver"
driver = webdriver.Chrome(chromedriver)

driver.get("http://107.170.101.241:8080/getTableColumn/")
time.sleep(1)

datab = driver.find_element_by_xpath("//select[@name='dbVendor']")
database = Select(datab)
database.select_by_visible_text("Sybase")

datab2 = driver.find_element_by_xpath("//select[@name='options']")
database2 = Select(datab2)
database2.select_by_visible_text("Show By SQL Clause")

txt = driver.find_element_by_xpath("//textarea[@name='sql']")
txt.clear()
txt.send_keys("select trd.M_NB as 'Trade_number' from CRD_TRADE_REP trd")

txt1 = driver.find_element_by_xpath("//textarea[@name='metadata']")
txt1.clear()
txt1.send_keys("CRD_TRADE_REP, M_NB")

analyze = driver.find_element_by_xpath("//input[@type='submit']")
analyze.send_keys("")
analyze.send_keys(Keys.RETURN)

#cant find this textarea below
out = driver.find_element_by_xpath("//textarea[@name='outputText']")

这是回溯:

Traceback (most recent call last):
  File "/Users/martinkubicka/Documents/fiverrgde.py", line 32, in <module>
    out = driver.find_element_by_xpath("//textarea[@name='outputText']")
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//textarea[@name='outputText']"}
  (Session info: chrome=84.0.4147.135)

【问题讨论】:

  • 使用基于相关 HTML、代码试验和错误堆栈跟踪的格式化文本更新问题。
  • 我认为您只是遇到了同步问题...您正在按下按钮并期望输出“立即”出现...但是,我认为有些脚本需要先运行....您是否在寻找输出文本出现之前? - 在创建驱动程序时添加隐式等待或添加显式等待以等待它出现 - 请参见此处:selenium-python.readthedocs.io/waits.html
  • 您的输出文本在 iframe 中
  • @RichEdwards 当我将 iframe 打印为文本时,它什么也没给我。试试看。

标签: python selenium dom reload


【解决方案1】:

在 devtools 中,如果您从元素向上滚动,您可以看到您的输出文本区域嵌套在:

<iframe name="result" id="result" style="height: 180px; width: 800px;" scrolling="no" frameborder="0">

这些需要在 selenium 中进行额外处理。

在你的脚本末尾试试这个:


#Get the frame
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='result']")))

#wait for your object to be ready - i  use clickable as i like it
out = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//textarea[@name='outputText']")))

print(out.text)
#do stuff your stuff to the "out" element here

#when ready to go back to the main page content (not the iframe)
driver.switch_to_default_content()

当我使用该添加运行您的代码时,我会得到输出:

表:tetSelect CRD_TRADE_REP(1,40) 列:selectList CRD_TRADE_REP.M_NB(1,12)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2012-03-06
    • 1970-01-01
    • 2021-12-23
    • 2017-12-24
    相关资源
    最近更新 更多