如何将更新的页面内容传递给另一个函数?

Posted

技术标签:

【中文标题】如何将更新的页面内容传递给另一个函数?【英文标题】:How do I pass the updated page content to another function? 【发布时间】:2020-04-04 16:55:56 【问题描述】:

我有一些 selenium-webdriver 的代码,如下所示:

 base_url = 'http://wsprnet.org/drupal/wsprnet/spotquery'
 driver = webdriver.Chrome()
 driver.get(base_url)

并且在输入登录名和密码后,页面会在这段代码之后更新:

btn_elem_upd = driver.find_element_by_id('edit-submit').click()

接下来需要将更新后的页面转移到另一个函数中,像这样:

url = "Here need transfer the new updated page"
res = requests.get(url)
doc = lxml.html.fromstring(res.text)

如何做到这一点?有什么选择? 更新,如果我这样写,代码可以工作:

new_source = 'http://wsprnet.org/drupal/wsprnet/spots'
res = requests.get(new_source)

doc = lxml.html.fromstring(res.text)

cols = []

cols.append(doc.xpath('//table/tr[1]/node()/text()')[0])
for item in doc.xpath('//table/tr/th'):
    typ = str(type(item.getnext()))
    if not 'NoneType' in typ:
        cols.append(item.getnext().text)

inf = []
for item in doc.xpath('//table//tr//td'):
    inf.append(item.text.replace('\\xa02', '').strip()) 

rows = [inf[x:x+len(cols)] for x in range(0, len(inf), len(cols))]

with open("output.csv", "w", newline='') as f:
    writer = csv.writer(f)
    writer.writerow(cols)
    for l in rows:
        writer.writerow(l)

如果我重写:

doc = lxml.html.fromstring(driver.page_source)
cols = []
cols.append(doc.xpath('//table/tr[1]/node()/text()')[0])

代码无法正常工作并出现错误:

cols.append(doc.xpath('//table/tr[1]/node()/text()')[0])
IndexError: list index out of range

【问题讨论】:

登录后是要URL吗? @TekNath 是的,但在登录 url = wsprnet.org/drupal/wsprnet/spotquery 之前和登录 url = wsprnet.org/drupal/wsprnet/spotquery 之后。但页面内容不同。 点击submit按钮后,如果你使用driver.page_source,你会得到HTML。这就是你想要的? @KunduK 是的,我尝试这种方式。但是如果我写 url = driver.page_source ,下一行会抛出一个错误 - res = requests.get(url)。我需要重写代码以便下一个构造起作用: res = requests.get(url) doc = lxml.html.fromstring(res.text) 您可以在登录后发布您的 html 以及您所追求的价值吗? 【参考方案1】:

根据我们的讨论,您可以使用 pandas 库来读取表信息并加载到 csv 文件中。

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
import pandas as pd

driver = webdriver.Chrome()
driver.get("http://wsprnet.org/drupal/wsprnet/spotquery")
login = driver.find_element_by_id('edit-name')
password = driver.find_element_by_id('edit-pass')
btn_elem_log = driver.find_element_by_id('edit-submit--2')
login.send_keys('username')
password.send_keys('password')
btn_elem_log.click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"edit-call"))).send_keys("searchval")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"edit-excludespecial"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"edit-submit"))).click()
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.TAG_NAME,"table")))
page=driver.page_source
df=pd.read_html(page)
df[0].to_csv("csvfile.csv",index=False)

【讨论】:

【参考方案2】:

使用在您的 selenium 代码中运行的 javascript 重定向到该新页面。 Selenium 支持这一点。所以你可以试试

driver.execute_script(f"window.location.replace('new_url');")

这应该将您的网络驱动程序发送到新 URL

如果您要在不同的功能中运行它,您可能想要打开这是一个新标签,以防万一,在新标签中打开您可以使用这个:

driver.execute_script(f"window.open('new_url');")

这将在新标签而不是当前活动标签中打开 URL,尽管这也意味着您必须在标签之间切换才能访问不同的网页,并且您可能希望在使用它们后关闭标签或它可能会变得混乱。

【讨论】:

不,它不起作用。网址不变,内容在变化

以上是关于如何将更新的页面内容传递给另一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用html将一个页面的值传递给另一个页面

如何通过php中的按钮单击将AJAX信息传递给另一个用户?

如何将选中的复选框值传递给另一个页面?

REACTJS 和 API 将 Api 的值传递给另一个页面

我正在尝试使用 WebView 登录页面将控制权传递给另一个 ViewController

将捆绑包/意图传递给另一个活动?