I managed to write a script that does exactly what you want: it hides screen-only styles and sets only screen-only print styles.
You need to enter the following Selenium script:
(function pretendToBeAPrinter() {
function hasMedia(list, media) {
if (!list) return false;
var i = list.length;
while (i--) {
if (list[i] === media) {
return true;
}
}
return false;
}
for (var styleSheetNo = 0; styleSheetNo < document.styleSheets.length; styleSheetNo++) {
var styleSheet = document.styleSheets[styleSheetNo];
console.info("Stylesheet #" + styleSheetNo + ":");
console.log(styleSheet);
if (hasMedia(styleSheet.media, "screen") && !hasMedia(styleSheet.media, "print")) {
styleSheet.disabled = true;
}
if (!hasMedia(styleSheet.media, "screen") && hasMedia(styleSheet.media, "print")) {
styleSheet.media.appendMedium("screen");
}
var rules;
try {
rules = styleSheet.cssRules;
} catch (error) {
console.log(error);
}
try {
rules = styleSheet.rules;
} catch (error) {
console.log(error);
}
if (!rules) {
continue;
}
for (var ruleNo = 0; ruleNo < rules.length; ruleNo++) {
var rule = rules[ruleNo];
if (hasMedia(rule.media, "screen") && !hasMedia(rule.media, "print")) {
console.info('Rule.media:');
console.log(rule.media)
rule.media.appendMedium(':not(screen)');
rule.media.deleteMedium('screen');
console.info('Rule.media after tampering:');
console.log(rule.media)
}
if (!hasMedia(rule.media, "screen") && hasMedia(rule.media, "print")) {
rule.media.appendMedium("screen");
}
}
}
})()
You can see it in action in the JSFiddle .
Bookmarklet
.
:
. Google Chrome Mozilla Firefox. .