The [`render.opengl()`][1] operator is working fine for all modes. But notice that it takes a screenshot of the first viewport found, quoting the docs: *"Take a snapshot of the active viewport"*. So in case you have multiple 3d viewports open at the same time it takes the first one in the area list of your screen ([`Screen.Areas`][2]). 

---

Obviously the simplest option is to *close all 3d viewports except one*, set the shading mode, call the operator and pass `write_still=True` to take the screenshot as well as saving the file into the default [*Output* directory][3]:

    >>> bpy.ops.render.opengl(write_still=True)



In case you have multiple viewports open and you'd like to specify the area for the screenshot, you can [override the context][4] when calling [`render.opengl()`][1] operator. See the following demo on how to find the first 3d viewport set to `'WIREFRAME'` and take a screenshot:

    import bpy
    
    C = bpy.context
    
    for area in C.screen.areas:
        if area.type=='VIEW_3D':
            # Check for WIREFRAME, SOLID, RENDERED, MATERIAL
            # area.spaces.active.shading.type
            if area.spaces.active.shading.type == 'WIREFRAME':
                override = C.copy()
                override['area'] = area
                bpy.ops.render.opengl(override)
                break

In order to set the filename, just temporary assign your path to the [`RenderSettings.filepath`][5] property. Demo on how to take a screenshot of the first viewport found set to `'WIREFRAME'` and save the result to the *directory of the current blend* file:

    file_path = bpy.path.abspath("//screenshot")
    
    for area in C.screen.areas:
        if area.type=='VIEW_3D':
            if area.spaces.active.shading.type == 'WIREFRAME':
                # Store the current output path and set it
                temp = C.scene.render.filepath
                C.scene.render.filepath = file_path
                
                override = C.copy()
                override['area'] = area
                bpy.ops.render.opengl(override, write_still=True)
                
                # Restore the output path
                C.scene.render.filepath = temp
                break
                
    print (file_path)

### 3.2 Update
Context overrides are deprecated in Blender 3.2 and are scheduled to be removed in Blender 3.3  The replacement is [`temp_override`](https://docs.blender.org/api/3.2/bpy.types.Context.html#bpy.types.Context.temp_override). The manual has examples of how to use the new function.

  [1]: https://docs.blender.org/api/current/bpy.ops.render.html?highlight=opengl#bpy.ops.render.opengl
  [2]: https://docs.blender.org/api/current/bpy.types.Screen.html?highlight=areas#bpy.types.Screen.areas
  [3]: https://docs.blender.org/manual/en/dev/render/output/properties/output.html
  [4]: https://blender.stackexchange.com/questions/6101/poll-failed-context-incorrect-example-bpy-ops-view3d-background-image-add
  [5]: https://docs.blender.org/api/current/bpy.types.RenderSettings.html?highlight=render%20filepath#bpy.types.RenderSettings.filepath