Merhaba Arkadaşlar,
Bu yazımda selenium WebDriver daki JavaScriptExecutor kullanımından bahsedeceğim. JavaScriptExecutor, selenium ile JavaScript çalıştırmaya yardımcı olan bir class dır. JavaScriptExecutor, seçilen pencerede veya geçerli sayfada javascript’i çalıştırmak için “executescript” ve “executeAsyncScript” methodlar sunuyor.
JavaScriptExecutor ‘ ı neden kullanalım ?
Bazı projelerde eski teknolojiler kullanıldığından ötürü selenium ile bazı işlemleri yaptıramayabiliyoruz. Bu gibi durumlarda yapmak istediğimiz işlemleri javascript ile yapabiliriz ya da test süremizi daha da hızlandırmak için bazı işlemleri javascript ile yapabiliriz.
Şunları yapalım ;
Projemize öncelikle aşağıdaki ki interface imizi ekleyelim. Yazıyı hazırlamadan önce ben 26 method yazdım fakat javascript ile yapılacakların sınırı yok sizlerde kendi projenize ihtiyaca göre methodları ekleyebilirsiniz 🙂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import org.openqa.selenium.WebElement; public interface JSExecuter { <T> T executeScript(Class<T> clazz, String script, Object... args); Long getPageHeight(); String randomGenerate(int digit); Number randomNumberGenerate(int digit); String randomStringGenerate(int digit); JSExecuter openNewTab(String links); JSExecuter doubleClick(WebElement element); JSExecuter navigateToUrl(String links); JSExecuter click(WebElement element); String getText(WebElement element); JSExecuter selectByIndex(WebElement element, Integer index); JSExecuter selectByValue(WebElement element, String value); JSExecuter sendKeys(WebElement element, String value); Boolean isDisplayed(WebElement element); JSExecuter clear(WebElement element); String getSelectedOptionText(WebElement element); Long getSelectedOptionIndex(WebElement element); String getSelectedOptionValue(WebElement element); JSExecuter scrollToElement(WebElement element); Boolean isAttributePresent(WebElement element, String attribute); String getAttribute(WebElement element, String attribute); Boolean checkBoxChecked(WebElement element); JSExecuter allCheckBoxChecked(); JSExecuter pageZoom(Integer percentValue); JSExecuter pageRefresh(); String getCurrentUrl(); String getLocationPathName(); } |
Şimdi de methodların içeriğini doldurduğumuz class ımızı projemize ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JSHelper implements JSExecuter { private static final Logger logger = LoggerFactory.getLogger(JSHelper.class); private JavascriptExecutor jExecutor; public JSHelper(WebDriver driver) { this.jExecutor = (JavascriptExecutor) driver; } public <T> T executeScript(Class<T> clazz, String script, Object... args) { logger.info("JavaScript Execute Info : { " + script + " }", "Argument Info : { " + args + " }"); return clazz.cast(jExecutor.executeScript(script, args)); } @Override public Long getPageHeight() { return executeScript(Long.class, "return $(document).height()"); } @Override public String randomGenerate(int digit) { return executeScript(String.class, "var text = ''; var possible = 'abcdefghijklmnopqrstuvwxyz0123456789'; for (var i = 0; i < arguments[0]; i++) text += possible.charAt(Math.floor(Math.random() * possible.length)); return text;", digit); } @Override public Number randomNumberGenerate(int digit) { return executeScript(Number.class, "return Math.floor(Math.random() * Math.floor(Math.pow(10, arguments[0])))", digit); } @Override public String randomStringGenerate(int digit) { return executeScript(String.class, "return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, arguments[0]);", digit); } @Override public JSExecuter openNewTab(String links) { return executeScript(JSExecuter.class, "window.open(" + links + ",'_blank');"); } @Override public JSExecuter doubleClick(WebElement element) { return executeScript(JSExecuter.class, "for(var i=0; i < 2; i++) {arguments[0].click();}", element); } @Override public JSExecuter navigateToUrl(String links) { return executeScript(JSExecuter.class, "window.location.href = '" + links + "';"); } @Override public JSExecuter click(WebElement element) { return executeScript(JSExecuter.class, "arguments[0].click();", element); } @Override public String getText(WebElement element) { return executeScript(String.class, "return arguments[0].textContent;", element); } @Override public JSExecuter selectByIndex(WebElement element, Integer index) { return executeScript(JSExecuter.class, "arguments[0].selectedIndex = arguments[1]", element, index); } @Override public JSExecuter selectByValue(WebElement element, String value) { return executeScript(JSExecuter.class, "arguments[0].value = arguments[1]", element, value); } @Override public JSExecuter sendKeys(WebElement element, String value) { return executeScript(JSExecuter.class, "arguments[0].value = arguments[1]", element, value); } @Override public Boolean isDisplayed(WebElement element) { return executeScript(Boolean.class, "function isVisible(elem) {\n" + " if (!(elem instanceof Element)) throw Error('DomUtil: elem is not an element.');\n" + " const style = getComputedStyle(elem);\n" + " if (style.display === 'none') return false;\n" + " if (style.visibility !== 'visible') return false;\n" + " if (style.opacity < 0.1) return false;\n" + " if (elem.offsetWidth + elem.offsetHeight + elem.getBoundingClientRect().height +\n" + " elem.getBoundingClientRect().width === 0) {\n" + " return false;\n" + " }\n" + " const elemCenter = {\n" + " x: elem.getBoundingClientRect().left + elem.offsetWidth / 2,\n" + " y: elem.getBoundingClientRect().top + elem.offsetHeight / 2\n" + " };\n" + " if (elemCenter.x < 0) return false;\n" + " if (elemCenter.x > (document.documentElement.clientWidth || window.innerWidth)) return false;\n" + " if (elemCenter.y < 0) return false;\n" + " if (elemCenter.y > (document.documentElement.clientHeight || window.innerHeight)) return false;\n" + " let pointContainer = document.elementFromPoint(elemCenter.x, elemCenter.y);\n" + " do {\n" + " if (pointContainer === elem) return true;\n" + " } while (pointContainer = pointContainer.parentNode);\n" + " return false;\n" + "}\n" + "return isVisible(arguments[0])", element); } @Override public JSExecuter clear(WebElement element) { return executeScript(JSExecuter.class, "arguments[0].value = ''", element); } @Override public String getSelectedOptionText(WebElement element) { return executeScript(String.class, "function getSelectedText(el) {\n" + "if (el.selectedIndex == -1) return null;\n" + "return el.options[el.selectedIndex].text;}\n" + "return getSelectedText(arguments[0]);", element); } @Override public Long getSelectedOptionIndex(WebElement element) { return executeScript(Long.class, "return arguments[0].selectedIndex", element); } @Override public String getSelectedOptionValue(WebElement element) { return executeScript(String.class, "return arguments[0].value", element); } @Override public JSExecuter scrollToElement(WebElement element) { return executeScript(JSExecuter.class, "arguments[0].scrollIntoView({behavior: 'smooth', block: 'end', inline: 'nearest'});", element); } @Override public Boolean isAttributePresent(WebElement element, String attribute) { return executeScript(Boolean.class, "var value = arguments[0].getAttribute(arguments[1]); if(value !== null) {return true} else return false;", element, attribute); } @Override public String getAttribute(WebElement element, String attribute) { return executeScript(String.class, "return arguments[0].getAttribute(arguments[1]);", element, attribute); } @Override public Boolean checkBoxChecked(WebElement element) { return executeScript(Boolean.class, "return arguments[0].checked;", element); } @Override public JSExecuter allCheckBoxChecked() { return executeScript(JSExecuter.class, "var checkboxes = document.querySelectorAll(\"input[type='checkbox']\"); for(var i = 0; i < checkboxes.length; i++) {checkboxes[i].checked = true;}"); } @Override public JSExecuter pageZoom(Integer percentValue) { return executeScript(JSExecuter.class, "document.body.style.zoom = arguments[0]", percentValue); } @Override public JSExecuter pageRefresh() { return executeScript(JSExecuter.class, "location.reload()"); } @Override public String getCurrentUrl() { return executeScript(String.class, "return location.href"); } @Override public String getLocationPathName() { return executeScript(String.class, "return location.pathname"); } } |
Projemizin bir kenarında js katmanının olmasında fayda var 🙂
İyi Çalışmalar
Enes Aydın