Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhanced XPath generation for better text based verification #7

Merged
merged 15 commits into from
Oct 3, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
<mkdir dir="${lib}"/>
<echo>basedir: ${basedir}</echo>
<echo>VM: ${java.vm.name}</echo>
<echo>VM Version: ${java.vm.specification.version}</echo>
<echo>VM Vendor: ${java.vm.vendor}</echo>
<echo>VM Build: ${java.vm.version}</echo>
<echo>Username: ${user.name}</echo>
</target>

Expand Down
51 changes: 51 additions & 0 deletions src/org/synthuse/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ public class Config extends PropertiesSerializer {
public String xpathList = "";
public String xpathHightlight = ".*process=\"([^\"]*)\".*";

public boolean useStrongTextMatching = false;


public Config() //needed for cloning
{
}
Expand All @@ -37,20 +40,36 @@ public boolean isUiaBridgeDisabled()
return disableUiaBridge.equals("true") || disableUiaBridge.equals("True");
}


public void setDisableUiaBridge(boolean aNewValue) {
disableUiaBridge=aNewValue?"true":"false";
}


public boolean isFilterUiaDisabled()
{
if (disableFiltersUia == null)
return false;
return disableFiltersUia.equals("true") || disableFiltersUia.equals("True");
}

public void setDisableFiltersUia(boolean aNewValue) {
disableFiltersUia=aNewValue?"true":"false";
}


public boolean isAlwaysOnTop()
{
if (alwaysOnTop == null)
return new Config().alwaysOnTop.equals("true") || new Config().alwaysOnTop.equals("True");
return alwaysOnTop.equals("true") || alwaysOnTop.equals("True");
}

public void setAlwaysOnTop(boolean aNewValue)
{
alwaysOnTop=aNewValue?"true":"false";
}

public int getRefreshKeyCode()
{
String keyStr = "";
Expand All @@ -62,6 +81,10 @@ else if (this.refreshKey.isEmpty())
keyStr = this.refreshKey;
return RobotMacro.getKeyCode(keyStr.charAt(0))[0];
}

public void setRefreshKeyCode(String aText) {
this.refreshKey=aText;
}

public int getTargetKeyCode()
{
Expand All @@ -74,4 +97,32 @@ else if (this.targetKey.isEmpty())
keyStr = this.targetKey;
return RobotMacro.getKeyCode(keyStr.charAt(0))[0];
}

public void setTargetKeyCode(String aText) {
this.targetKey=aText;
}

public boolean isUseStrongTextMatching() {
return useStrongTextMatching;
}

public void setUseStrongTextMatching(boolean useStrongTextMatching) {
this.useStrongTextMatching = useStrongTextMatching;
}

public String getXpathList() {
return xpathList;
}

public void setXPathList(String aText) {
xpathList=aText;
}

public String getXpathHighlight() {
return xpathHightlight;
}

public void setXPathHighlight(String aText) {
xpathHightlight=aText;
}
}
45 changes: 45 additions & 0 deletions src/org/synthuse/SynthuseConfigDialog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.synthuse;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import org.synthuse.controllers.SynthuseConfigDialogControllers;
import org.synthuse.views.SynthuseConfigPanel;

public class SynthuseConfigDialog extends JDialog {

/**
*
*/
private static final long serialVersionUID = -4877764256323621418L;

private Config theConfig; //Model
private final SynthuseConfigPanel theSynthuseConfigPanel; //View

public SynthuseConfigDialog(JFrame aParentFrame, Config aConfig) {
super(aParentFrame);

this.setConfig(aConfig);

this.setTitle("Synthuse Properties");

theSynthuseConfigPanel = new SynthuseConfigPanel();

SynthuseConfigDialogControllers.bindActionControllers(theSynthuseConfigPanel,theConfig);

this.getContentPane().add(theSynthuseConfigPanel);
this.setSize(492, 260);

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SynthuseConfigDialogControllers.initializeUI(theSynthuseConfigPanel,theConfig);
}
});
}

synchronized private void setConfig(Config aConfig) {
theConfig = aConfig;
}
}
33 changes: 29 additions & 4 deletions src/org/synthuse/SynthuseDlg.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@

import org.synthuse.Api.User32Ex;
import org.synthuse.DragTarget.dragEvents;
import org.synthuse.views.SynthuseConfigPanel;



Expand Down Expand Up @@ -85,6 +86,7 @@ public class SynthuseDlg extends JFrame {
private JButton btnAdvanced;

private TestIdeFrame testIde = null;
protected SynthuseConfigDialog configDialog=null;
//private MessageHookFrame msgHook = null;
private int targetX;
private int targetY;
Expand Down Expand Up @@ -283,17 +285,35 @@ public void actionPerformed(ActionEvent arg0) {
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridwidth = 1;
c.gridwidth = 2;
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(3,3,3,3); // add padding around objects

final DragTarget lblTarget = new DragTarget();

lblTarget.setHorizontalAlignment(SwingConstants.CENTER);
lblTarget.setIcon(new ImageIcon(SynthuseDlg.class.getResource(RES_STR_TARGET_IMG)));
final ImageIcon imageIcon = new ImageIcon(SynthuseDlg.class.getResource(RES_STR_TARGET_IMG));
lblTarget.setMinimumSize(new Dimension(imageIcon.getIconWidth(), imageIcon.getIconHeight()));
lblTarget.setIcon(imageIcon);
panel.add(lblTarget, c);

final JButton btnConfig = new JButton("Cfg");

btnConfig.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(configDialog==null) {
createConfigDialog();
}
configDialog.setVisible(true);
}

});
c.gridx = 2;
c.gridwidth = 1;
panel.add(btnConfig, c);

btnFind = new JButton("Find");
btnFind.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Expand Down Expand Up @@ -323,8 +343,8 @@ public void keyReleased(KeyEvent event) {
}
}
});
c.gridwidth = 3;
c.gridx = 1;
c.gridwidth = 1;
c.gridx = 3;
panel.add(cmbXpath, c);
btnFind.setIcon(new ImageIcon(SynthuseDlg.class.getResource(RES_STR_FIND_IMG)));
c.gridwidth = 1;
Expand Down Expand Up @@ -562,4 +582,9 @@ public void disposeWindow()
WindowEvent closingEvent = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(closingEvent);
}

private void createConfigDialog() {
configDialog=new SynthuseConfigDialog(this, config);
configDialog.setLocationRelativeTo(null);
}
}
20 changes: 18 additions & 2 deletions src/org/synthuse/XpathManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public XpathManager(HWND hwnd, String enumProperties, JTextPane windowsXmlTextPa

@Override
public void run() {
String results = buildXpathStatement();
String results = SynthuseDlg.config.isUseStrongTextMatching()?buildXpathStatement(true,50,50):buildXpathStatement();
events.executionCompleted(hwnd, results);
}

Expand Down Expand Up @@ -143,7 +143,23 @@ public String buildXpathStatement(boolean useFullTextMatching, int maxParentText
parentTxtStr = " and @text='" + parentTxtStr + "'";
}
if (!parentClassStr.isEmpty())
builtXpath = "//win[@class='" + parentClassStr + "'" + parentTxtStr + "]/win[@class='" + classStr + "']";
{
if (!txtStr.isEmpty()&&useFullTextMatching) {
String copyOfTxtStr = txtStr;
if (copyOfTxtStr.length() > maxTextLength) {// if the text is too long only test the first maxTextLength characters
copyOfTxtStr = WindowsEnumeratedXml.escapeXmlAttributeValue(copyOfTxtStr.substring(0, maxTextLength));
copyOfTxtStr = " and starts-with(@text,'" + copyOfTxtStr + "')";
}
else
copyOfTxtStr = " and @text='" + copyOfTxtStr + "'";
builtXpath = "//win[@class='" + parentClassStr + "'" + parentTxtStr + "]/win[@class='" + classStr + "'" + copyOfTxtStr + "]";
}
else
{
builtXpath = "//win[@class='" + parentClassStr + "'" + parentTxtStr + "]/win[@class='" + classStr + "']";
}
}
System.out.println(builtXpath);
resultList = WindowsEnumeratedXml.evaluateXpathGetValues(xml, builtXpath);
if (resultList.size() > 1) { // if there are still multiple results add position to the xpath
int position = 1;
Expand Down
121 changes: 121 additions & 0 deletions src/org/synthuse/controllers/SynthuseConfigDialogControllers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package org.synthuse.controllers;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import org.synthuse.Config;
import org.synthuse.views.SynthuseConfigPanel;

public class SynthuseConfigDialogControllers {

public static void initializeUI(SynthuseConfigPanel aSynthuseConfigPanel, Config aConfig) {
aSynthuseConfigPanel.getAlwaysOnTopCheckBox().setSelected(aConfig.isAlwaysOnTop());
aSynthuseConfigPanel.getDisableFiltersUiaCheckBox().setSelected(aConfig.isFilterUiaDisabled());
aSynthuseConfigPanel.getDisableUiaBridgeCheckBox().setSelected(aConfig.isUiaBridgeDisabled());
aSynthuseConfigPanel.getRefreshKeyTextField().setText(Integer.toString(aConfig.getRefreshKeyCode()));
aSynthuseConfigPanel.getStrongTextMatchingCheckBox().setSelected(aConfig.isUseStrongTextMatching());
aSynthuseConfigPanel.getTargetKeyTextField().setText(Integer.toString(aConfig.getTargetKeyCode()));
aSynthuseConfigPanel.getXPathHighlightTextField().setText(aConfig.getXpathHighlight());
aSynthuseConfigPanel.getXPathListTextField().setText(aConfig.getXpathList());
}

public static void bindActionControllers(final SynthuseConfigPanel aSynthuseConfigPanel, final Config aConfig) {
aSynthuseConfigPanel.getAlwaysOnTopCheckBox().addActionListener(alwaysOnTopCheckboxActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getDisableFiltersUiaCheckBox().addActionListener(disableFiltersUiaCheckboxActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getDisableUiaBridgeCheckBox().addActionListener(disableUiaBridgeCheckboxActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getRefreshKeyTextField().addActionListener(refreshKeyCodeTextFieldActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getStrongTextMatchingCheckBox().addActionListener(strongTextMatchingCheckboxActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getTargetKeyTextField().addActionListener(targetKeyCodeTextFieldActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getXPathHighlightTextField().addActionListener(xpathHighlightTextFieldActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getXPathListTextField().addActionListener(xpathListTextFieldActionHandler(aSynthuseConfigPanel, aConfig));
}

private static ActionListener xpathListTextFieldActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setXPathList(aSynthuseConfigPanel.getXPathListTextField().getText());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener xpathHighlightTextFieldActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setXPathHighlight(aSynthuseConfigPanel.getXPathHighlightTextField().getText());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener targetKeyCodeTextFieldActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setTargetKeyCode(aSynthuseConfigPanel.getTargetKeyTextField().getText());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener strongTextMatchingCheckboxActionHandler(
final SynthuseConfigPanel aSynthuseConfigPanel, final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setUseStrongTextMatching(aSynthuseConfigPanel.getStrongTextMatchingCheckBox().isSelected());
}
};
}

private static ActionListener refreshKeyCodeTextFieldActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setRefreshKeyCode(aSynthuseConfigPanel.getRefreshKeyTextField().getText());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener disableUiaBridgeCheckboxActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setDisableUiaBridge(aSynthuseConfigPanel.getDisableUiaBridgeCheckBox().isSelected());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener disableFiltersUiaCheckboxActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setDisableFiltersUia(aSynthuseConfigPanel.getDisableFiltersUiaCheckBox().isSelected());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener alwaysOnTopCheckboxActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setAlwaysOnTop(aSynthuseConfigPanel.getAlwaysOnTopCheckBox().isSelected());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}
}
Loading