Can someone help with Groovy code in creating a custom keyword in Katalon Studio to check if an element is selected or grayed out?
Here's an example that opens up Katalon home page and checks whether the "Free Download" button is selected (using WebElement's .selected property):
import org.openqa.selenium.WebElement as WebElement
import com.kms.katalon.core.testobject.ConditionType
import com.kms.katalon.core.testobject.TestObject as TestObject
import com.kms.katalon.core.webui.common.WebUiCommonHelper
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
WebUI.openBrowser("https://www.katalon.com")
def isSelected(TestObject to){
WebElement element = WebUiCommonHelper.findWebElement(to, 3)
return element.selected
}
TestObject tobject = new TestObject().addProperty("css", ConditionType.EQUALS, ".btn-download")
println(isSelected(tobject))
Related
How to set jxBrowser to open links that would pop-up in a new window to open on the calling page (or, at least, in a new tab)?
this is the call I think I have to override (it's the example):
//....
Engine engine = Engine.newInstance(
EngineOptions.newBuilder(
enderingMode.OFF_SCREEN ).enableIncognito().build()
Browser _browser = engine.newBrowser();
//this won't even compile
_browser.set(
OpenPopupCallback.class,
(params) -> {
// Access the created popup.
Browser popup = params.popupBrowser();
_browser.navigation().loadUrl(params.targetUrl());
return Response.proceed();
});
_browser.navigation().loadUrl("http://www.stackoverflow.com");
This is how I call it in my jfx but won't even compile, the code without this call works (opens a browser).
Update, given the nature of the popup I tried to rewrite javascript function (window.open) itself to force name to _parent.
This by running on every navigation the code
String the Javascript = "window.open = function (open) {return function (url, name, features{ console.log("open wrapper");return open.call(window, url, '_parent', features);};}(window.open);"
I thaught I couldn achieve this by
_browser.frames().get(0).executeJavaScript(theJavascript);
But in the remote console, I can't even see the log message ("open wrapper").
I double-checked the same code and it works if copy-pasted in the remote consolle.
What am I missing?
Here's complete JavaFX example that demonstrates how to open popup's URL in the main Browser instance and suppress popup:
import static com.teamdev.jxbrowser.engine.RenderingMode.OFF_SCREEN;
import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.browser.callback.CreatePopupCallback;
import com.teamdev.jxbrowser.browser.callback.CreatePopupCallback.Response;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.view.javafx.BrowserView;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public final class SmokeTest extends Application {
#Override
public void start(Stage primaryStage) {
// Creating and running Chromium engine.
Engine engine = Engine.newInstance(OFF_SCREEN);
Browser browser = engine.newBrowser();
browser.set(CreatePopupCallback.class, params -> {
browser.navigation().loadUrl(params.targetUrl());
return Response.suppress();
});
// Creating UI component for rendering web content
// loaded in the given Browser instance.
BrowserView view = BrowserView.newInstance(browser);
BorderPane root = new BorderPane(view);
Scene scene = new Scene(root, 1280, 900);
primaryStage.setTitle("Hello World");
primaryStage.setScene(scene);
primaryStage.show();
browser.navigation().loadUrl(
"https://www.encodedna.com/javascript/demo/open-new-window-using-javascript-method.htm");
// Close the engine when stage is about to close.
primaryStage.setOnCloseRequest(event -> engine.close());
}
}
Run this program and click a button that displays popup. You will see that popup is not displayed and its URL is loaded in the main Browser.
There is a mouse hover drop-down where the drop-down appears on hover and disappears if the mouse pointer is moved way from the drop-down. I tried using "Actions" class to hover on the drop-down element but i cannot see the drop-down after the mouse hover is performed. The drop-down doesn't stay till the next action is performed.
Is there any way where there is a wait after the hover is performed so that the drop-down appears for a longer time in order to select/click elements from the drop-down?
Code:
driver= new ChromeDriver();
driver.get("w3schools.com/howto/howto_css_dropdown.asp");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
WebElement element = driver.findElement(By.xpath(".//*#id='main']/div[3]/button"));
Actions action= new Actions(driver);
action.moveToElement(element).perform();
Thread.sleep(5000);
Environment:
Chrome version: 56.0.2924.87 (64-bit)
Chrome driver: 2.27
Use same code that you wrote for mouse hover action and try following solution before mouse hover action.
Keep mouse cursor on task bar.
OR
Move mouse cursor at (0, 0) browser location.
After perform() you need to traverse through the elements.
Here is the working code:
package demo;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
public class MouseHoverDemo_w3school {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.w3schools.com/howto/howto_css_dropdown.asp");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
WebElement ele = driver.findElement(By.xpath(".//div[#class='dropdown dropdown2']/button"));
Actions act = new Actions(driver);
act.moveToElement(ele).perform();
List<WebElement> links = driver.findElements(By.xpath(".//div[#class='dropdown-content']/a"));
int total_count = links.size();
for (int i=0; i<total_count; i++)
{
WebElement element = links.get(i);
String text = element.getAttribute("innerHTML");
System.out.println("Link Name is : "+text);
}
driver.quit();
}
}
Let me know if this answers your question.
I tried this code. Its automating the browser, logging in successfully but I'm not able to logout successfully. Please Help.
public class fb {
public static void main(String args[])
{
WebDriver driver = new FirefoxDriver();
driver.get("https://facebook.com");
driver.manage().window().maximize();
driver.findElement(By.xpath(".//*[#id='email']")).sendKeys("your email");
driver.findElement(By.xpath(".//*[#id='pass']")).sendKeys("your password");
driver.findElement(By.xpath(".//*[#id='u_0_n']")).click();
driver.findElement(By.xpath(".//*[#id='userNavigationLabel']")).click();
driver.findElement(By.id("u_7_2")).click();// for logout-> button.But not working.
Automation Script for FaceBook Login and logout:
WebDriver driver = new FirefoxDriver();
driver.get("https://www.facebook.com/");
driver.manage().window().maximize();
driver.findElement(By.xpath(".//*[#id='email']")).sendKeys("your email");
driver.findElement(By.xpath(".//*[#id='pass']")).sendKeys("your password");
//click for login
driver.findElement(By.xpath("//label[#id='loginbutton']/input")).click();
//Mouse over on logOut drop down menu icon,then click logout
WebElement mouseOverEle = driver.findElement(By.id("pageLoginAnchor"));
Actions actions = new Actions(driver);
actions.moveToElement(mouseOverEle).click().perform();
//click for logout
driver.findElement(By.xpath("//input[#value='Log Out']")).click();
Try Using the below code to click on the log out button
//wait for the userNavigationLabel to load fully any wait techniques implicit or explicit for sample i have used Thread.sleep although it is not recommended
Thread.sleep(3000);
JavascriptExecutor js = (JavascriptExecutor) driver;
String script = "var forms = document.getElementsByTagName('form');for (var i = 0; i < forms.length; i++) { if(forms[i].getAttribute('action')=='https://www.facebook.com/logout.php'){forms[i].submit();}}";
js.executeScript(script);
In the above code i have used javascript to click on the logout button...i tested it on the browser console it is working fine
Hope this helps you.....Kindly get back if you have any queries
try:
lsb=browser.find_element_by_xpath('//*[#id="pageLoginAnchor"]')
lsb.click()
time.sleep(5)
mlb=browser.find_element_by_xpath('//*[#id="u_d_3"]/div/div/div[1]/div/div/ul/li[16]')
time.sleep(2)
mlb.click()
inputElement33 = browser.find_element_by_name('pass').is_displayed()
print("Looged out")
except:
print("Cannot logout")
// Enter you Email id
dr.findElement(By.xpath(".//*[#id='email']")).sendKeys("YorEmailID");
// Enter you Password
dr.findElement(By.xpath(".//*[#id='pass']")).sendKeys("YourPassword");
//click for login
dr.findElement(By.xpath("//label[#id='loginbutton']/input")).click();
dr.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
// Click for Alert
dr.findElement(By.className("_3ixn")).click();
//Click for Navigation Label
dr.findElement(By.xpath(".//*[#id='userNavigationLabel']")).click();
dr.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
//Click for Lout Button
dr.findElement(By.xpath("//a[contains(#data-gt,'menu_logout')]")).click();
Replace your logout button click with this.
//Wait for button appear
WebDriverWait wait = new WebDriverWait(driver,TimeSpan.FromSeconds(4));
wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//a[.='Log out']")));
//Click it by xpath
driver.FindElement(By.XPath("//a[.='Log out']")).Click();
Or:
//Wait for button appear
WebDriverWait wait = new WebDriverWait(driver,TimeSpan.FromSeconds(4));
wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//a[.='Log out']")));
//Click it by JS
IJavaScriptExecutor js = ((IJavaScriptExecutor)driver);
IWebElement logout = driver.FindElement(By.XPath("//a[.='Log out']"));
js.ExecuteScript("arguments[0].click();", logout);
100% worked
**#Working script**
**#firefox can be used too instead of chrome**
**#sleep is necessary to give sufficient loading time**
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.common.exceptions import NoSuchElementException
usr=input('Enter Email Id:')
pwd=input('Enter Password:')
driver = webdriver.Chrome()
driver.get('https://www.facebook.com/')
a = driver.find_element_by_id('email')
a.send_keys(usr)
b = driver.find_element_by_id('pass')
b.send_keys(pwd)
c = driver.find_element_by_id('loginbutton')
c.click()
sleep(20)
d= driver.find_element_by_id("userNavigationLabel")
d.click()
sleep(10)
e=driver.find_element_by_xpath("//a[contains(#data-gt,'menu_logout')]")
e.click()
sleep(5)
driver.quit()
There are duplicate objects in the Home page.Hence, to avoid confusion,Xpath can be written in combination of class names, which in our case is,
//div[#class='uiScrollableAreaBody']/following::div[#class='uiScrollableAreaContent']/following::ul/li
Get the maximum number of <li> tags in the <ul> as follows ,
List<WebElement> li = driver.findElements(By.xpath("//div[#class='uiScrollableAreaBody']/following::div[#class='uiScrollableAreaContent']/following::ul/li"));
System.out.println("Size:"+li.size());
The Log out button will always be the last option, inspite of any changes to the list , hence append the last index to the xpath and click on it ,
String logOutBtn = "//div[#class='uiScrollableAreaBody']/following::div[#class='uiScrollableAreaContent']/following::ul/li[" + li.size() + "]";
driver.findElement(By.xpath(logOutBtn)).click(); -- Clicking on log out button
Hope this helps ! Thank you ..
package package1;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class class1 {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver","C:\\Users\\CloudLogic.Tech01\\Desktop\\Selenium\\chromedriver_win32\\chromedriver.exe");
WebDriver drr = new ChromeDriver();
drr.get("https://www.facebook.com/");
drr.findElement(By.id("email")).sendKeys("emailId");
drr.findElement(By.id("pass")).sendKeys("********");
drr.findElement(By.xpath("//label[#id='loginbutton']")).click();
}
}
I am trying a sample with icePDF . Everything is working fine but i need to disable the toolbar which appears at the top. i tried few things but its not working. Can some body please help me out with it. Below is my code.
//package XML.test;
package applet;
import java.util.ResourceBundle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.icepdf.ri.common.ComponentKeyBinding;
import org.icepdf.ri.common.SwingController;
import org.icepdf.ri.common.SwingViewBuilder;
import org.icepdf.ri.util.PropertiesManager;
import org.icepdf.core.pobjects.fonts.*;
import org.icepdf.core.views.DocumentViewController;
import org.icepdf.core.*;
public class ViewerComponentExample
{
static void buildFrame(String filepath)
{
System.getProperties().put("org.icepdf.core.scaleImages", "false");
System.getProperties().put("org.icepdf.core.imageReference","smoothScaled");
System.getProperties().put("org.icepdf.core.target.dither", "VALUE_DITHER_DISABLE");
System.getProperties().put("org.icepdf.core.target.fractionalmetrics", "VALUE_FRACTIONALMETRICS_OFF");
System.getProperties().put("org.icepdf.core.target.interpolation", "VALUE_INTERPOLATION_NEAREST_ NEIGHBOR");
System.getProperties().put("org.icepdf.core.screen.interpolation", "VALUE_INTERPOLATION_NEAREST_NEIGHBOR");
System.getProperties().put("org.icepdf.core.awtFontLoading","true");
SwingController controller = new SwingController();
PropertiesManager properties = new PropertiesManager(System.getProperties(), ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE));
properties.setBoolean(PropertiesManager.PROPERTY_SHOW_TOOLBAR_ANNOTATION, Boolean.FALSE);
properties.setBoolean(PropertiesManager.PROPERTY_SHOW_TOOLBAR_FIT, Boolean.FALSE);
// Build a SwingViewFactory configured with the controller
SwingViewBuilder factory = new SwingViewBuilder(controller);
JPanel viewerComponentPanel = factory.buildViewerPanel();
// add copy keyboard command
ComponentKeyBinding.install(controller, viewerComponentPanel);
// add interactive mouse link annotation support via callback
controller.getDocumentViewController().setAnnotationCallback(
new org.icepdf.ri.common.MyAnnotationCallback(
controller.getDocumentViewController()));
// Use the factory to build a JPanel that is pre-configured
//with a complete, active Viewer UI.
// Create a JFrame to display the panel in
JFrame window = new JFrame("Metrics Wizard Help");
window.getContentPane().add(viewerComponentPanel);
window.pack();
window.setVisible(true);
controller.setPageFitMode(DocumentViewController.PAGE_FIT_WINDOW_WIDTH, false);
controller.openDocument(filepath);
}
public static void main(String args[])
{
String filepath = "C:/Users/vishalt/Workspaces/Eclipse 4.2 Java/htmltopdf/src/XML/output/SCB_TEST.pdf";
buildFrame(filepath);
}
}
private SwingController controller;
controller = new SwingController();
SwingViewBuilder viewBuilder = new SwingViewBuilder(controller, properties);
JPanel panel = viewBuilder.buildViewerPanel();
controller.setToolBarVisible(false);
You have to set the toolbar invisible because icePdf looks in the PDF-document for the property and overwrites your setting with default when there is no document opened!
There are two ways to this.
1) Follow this example to set all the toolbars to false.
http://www.icesoft.org/JForum/posts/list/17673.page#sthash.48ICrL2A.dpbs
2) You can modify or remove the toolbar by editing the source code for SwingViewBuilder.
Here is a link to the code: http://sventon.icesoft.org/svn/repos/repo/show//icepdf/trunk/icepdf/viewer/src/org/icepdf/ri/common/SwingViewBuilder.java?revision=34004
You probably want to comment out lines 481 - 483.
481 JToolBar toolBar = buildCompleteToolBar(embeddableComponent);
482 if (toolBar != null)
483 cp.add(toolBar, BorderLayout.NORTH)
Remove your import for SwingViewBuilder and create your own class with those lines commented out.
I want to launch an contact-activity when a input-field (text) in a webview is pressed. Not sure how I can do this. Have tried to search the web but the only results I get is how to launch a filebrowser when a "input-file-field" is pressed.. And it seems like Android have an option that is exactly for that purpose, but not when another input-type is pressed?
What I actually want to do is;
when the input field is pressed, I want to give the user an option to launch the contact manager (or something similar) to choose one or more contacts from its contactlist.
Then fill the input-field with the contacts emails, separated with commas.
Is it possible to do this? Any idea what I should search the web for?
Solved! Added a new class:
import android.content.Context;
import android.content.Intent;
public class JSFromPage {
Context mContext;
JSFromPage(Context c) {
mContext = c;
}
public void openContact() {
Intent intent = (Intent) new Intent( mContext, ListContacts.class );
mContext.startActivity( intent );
}
}
And uses this is my WebView class:
mWebView.addJavascriptInterface(new JSFromPage(this), "Android");
And this is my html on the input:
onclick="Android.openContact();"
Then i created the class "ListContacts.class" with a new activity.