javascript 单击重定向按钮时,在DOM更改之前获取DOM内的变量

rqqzpn5f  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(135)

我一直在尝试找到一种方法来持久化变量在页面刷新和不同的页面在一个浏览器会话从selenium python打开.不幸的是,无论是存储变量在localStorage,sessionStorage或www.example.com不工作后,测试了这么多次和研究.window.name doesn't work after testing so many times and research.
所以我求助于一个python脚本,它不断重复driver. execute_script('return variable'),并在浏览时继续收集数据。需要收集的数据是被单击的元素的值,它被eventListener捕获以供单击,并插入到我添加到页面的局部变量中。
这一切工作正常,除了被点击的元素是包含重定向页面和更改DOM的链接的实际按钮。
我最好的猜测是,在同一时刻,单击、存储变量的JavaScript脚本、检索变量的JavaScript脚本以及页面重定向几乎同时发生,我怀疑DOM的更改发生在检索变量之前,因此取消了我获取该数据的任何努力。
这是密码:

from selenium.common import TimeoutException, WebDriverException
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver

class Main:
def __init__(self, page_url):
    self.__driver = webdriver.Chrome()
    self.__element_list = []
    self.__page_url = page_url

def start(self):
    program_return = []

    self.__driver.get(self.__page_url)
    event_js = '''
    var array_events = []

    var registerOuterHtml = (e) => {
        array_events.push(e.target.outerHTML)
        window.array_events = array_events
        }
    var registerUrl = (e) => {
        array_events.push(document.documentElement.outerHTML)
        }

    getElementHtml = document.addEventListener("click", registerOuterHtml, true)
    getDOMHtml = document.addEventListener("click", registerUrl, true)
    '''
    return_js = '''return window.array_events'''
    self.__driver.set_script_timeout(10000)
    self.__driver.execute_script(event_js)
    try:
        for _ in range(800):
            if array_events := self.__driver.execute_script(return_js):
                if array_events[-2:] not in program_return:
                    program_return.append(array_events[-2:])
            else:
                try:
                    WebDriverWait(self.__driver, 0.1).until(
                        lambda driver: self.__driver.current_url != self.__page_url)
                except TimeoutException:
                    pass
                else:
                    self.__page_url = self.__driver.current_url
                    self.__driver.execute_script(event_js)
    except WebDriverException:
        pass
    finally:
        print(len(program_return))  # should print total number of clicks made.

要测试它,请这样调用它:

Main('any url you wish').start()

点击后,应该至少点击一个按钮,改变页面,你可以手动关闭窗口,并检查结果。
请把类a的函数缩进到右边,为了我的生命,我不能在这里格式化它!
任何想法或理想的解决这个问题的方法将是非常感谢。
总的问题---想当然地认为不同页面之间的变量持久化是不可能的,我如何才能从同一个点击动作中获得在点击时间设置的变量的值,在页面改变之前?(也许延迟整个页面...??)

pxyaymoc

pxyaymoc1#

理论上,您可以在导航之前获得一些全局数据,例如:

data = driver.execute_async_script("""
  let [resolve] = arguments
  window.unload = () => resolve(window.some_global_data)
""")

但是很可能会超时...... puppet 师/剧作家更适合这样的事情。你可以试试他们的python移植。

相关问题