通过execute_script

时间:2018-09-19 03:10:50

标签: python selenium

我当前正在使用python 3.6.5,selenium版本3.14.0

如果我创建了如下所示的网络元素:

driver.execute_script("""var body = document.getElementsByTagName('body').item(0);var div = document.createElement('div');div.setAttribute('id', 'ZZZ');body.appendChild(div);""")

我无法使用以下内容:

    wait.until(
        expected_conditions.presence_of_element_located(
            (By.ID, 'ZZZ')
        )
    )

我已经仔细检查了元素是否已成功创建,但是使用了selenium包提供的API(例如find_element_by_id和上面的脚本),我无法找到该元素。

问题:在execute_script之后注入新元素之后,我还需要做其他事情吗?还是目前不可能?

我可以通过以下方法获取元素:

new_element = driver.execute_script('return document.getElementById("ZZZ");')

但是如果我不能使用selenium软件包提供的默认API(例如find_element_by_id)

,这对我来说将很困难

2 个答案:

答案 0 :(得分:2)

以下代码对我有用:

driver.get('http://www.google.com')
elem = driver.find_element_by_name("q")
driver.execute_script("var body = document.getElementsByTagName('body').item(0);var div = document.createElement('div');div.setAttribute('id', 'ZZZ');body.appendChild(div);")

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "ZZZ"))
)
driver.quit()

答案 1 :(得分:2)

@KireetiAnnamaraj的回答很完美。此外,如果您想验证添加的元素是否在 HTML 中,可以使用以下解决方案print() outerHTML

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get('http://www.google.com')
    elem = driver.find_element_by_name("q")
    driver.execute_script("var body = document.getElementsByTagName('body').item(0);var div = document.createElement('div');div.setAttribute('id', 'ZZZ');body.appendChild(div);")
    element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ZZZ")))
    print(element.get_attribute("outerHTML"))
    driver.quit()
    
  • 控制台输出:

    <div id="ZZZ"></div>