--- src/components/org/apache/jmeter/extractor/HtmlExtractor.java (revision 1754657) +++ src/components/org/apache/jmeter/extractor/HtmlExtractor.java (working copy) @@ -76,6 +76,8 @@ private static final String UNDERSCORE = "_"; // $NON-NLS-1$ + private static final String DEFAULT_EMPTY_VALUE = "HtmlExtractor.default_empty_value"; // $NON-NLS-1$ + private Extractor extractor; /** @@ -102,7 +104,7 @@ int matchNumber = getMatchNumber(); final String defaultValue = getDefaultValue(); - if (defaultValue.length() > 0){// Only replace default if it is provided + if (defaultValue.length() > 0 || isEmptyDefaultValue()){// Only replace default if it is provided or empty default value is explicitly requested vars.put(refName, defaultValue); } @@ -306,6 +308,10 @@ setProperty(DEFAULT, defaultValue); } + public void setDefaultEmptyValue(boolean defaultEmptyValue) { + setProperty(DEFAULT_EMPTY_VALUE, defaultEmptyValue); + } + /** * Get the default value for the variable if no matches are found * @return The default value for the variable @@ -313,4 +319,8 @@ public String getDefaultValue() { return getPropertyAsString(DEFAULT); } + + public boolean isEmptyDefaultValue() { + return getPropertyAsBoolean(DEFAULT_EMPTY_VALUE); + } } --- src/components/org/apache/jmeter/extractor/gui/HtmlExtractorGui.java (revision 1754657) +++ src/components/org/apache/jmeter/extractor/gui/HtmlExtractorGui.java (working copy) @@ -22,11 +22,14 @@ import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.util.List; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.DefaultComboBoxModel; +import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; @@ -64,7 +67,8 @@ private JComboBox extractorImplName; - + private JCheckBox emptyDefaultValue; + public HtmlExtractorGui() { super(); init(); @@ -84,6 +88,7 @@ expressionField.setText(htmlExtractor.getExpression()); attributeField.setText(htmlExtractor.getAttribute()); defaultField.setText(htmlExtractor.getDefaultValue()); + emptyDefaultValue.setSelected(htmlExtractor.isEmptyDefaultValue()); matchNumberField.setText(htmlExtractor.getMatchNumberAsString()); refNameField.setText(htmlExtractor.getRefName()); extractorImplName.setSelectedItem(htmlExtractor.getExtractor()); @@ -115,6 +120,7 @@ htmlExtractor.setExpression(expressionField.getText()); htmlExtractor.setAttribute(attributeField.getText()); htmlExtractor.setDefaultValue(defaultField.getText()); + htmlExtractor.setDefaultEmptyValue(emptyDefaultValue.isSelected()); htmlExtractor.setMatchNumber(matchNumberField.getText()); if(extractorImplName.getSelectedIndex()< HtmlExtractor.getImplementations().length) { htmlExtractor.setExtractor(HtmlExtractor.getImplementations()[extractorImplName.getSelectedIndex()]); @@ -136,6 +142,7 @@ attributeField.setText(""); //$NON-NLS-1$ defaultField.setText(""); //$NON-NLS-1$ refNameField.setText(""); //$NON-NLS-1$ + emptyDefaultValue.setSelected(false); matchNumberField.setText(""); //$NON-NLS-1$ } @@ -174,7 +181,6 @@ private JPanel makeParameterPanel() { expressionField = new JLabeledTextField(JMeterUtils.getResString("expression_field")); //$NON-NLS-1$ attributeField = new JLabeledTextField(JMeterUtils.getResString("attribute_field")); //$NON-NLS-1$ - defaultField = new JLabeledTextField(JMeterUtils.getResString("default_value_field")); //$NON-NLS-1$ refNameField = new JLabeledTextField(JMeterUtils.getResString("ref_name_field")); //$NON-NLS-1$ matchNumberField = new JLabeledTextField(JMeterUtils.getResString("match_num_field")); //$NON-NLS-1$ @@ -190,7 +196,28 @@ addField(panel, matchNumberField, gbc); resetContraints(gbc); gbc.weighty = 1; - addField(panel, defaultField, gbc); + + defaultField = new JLabeledTextField(JMeterUtils.getResString("default_value_field")); //$NON-NLS-1$ + List item = defaultField.getComponentList(); + panel.add(item.get(0), gbc.clone()); + JPanel p = new JPanel(new BorderLayout()); + p.add(item.get(1), BorderLayout.WEST); + emptyDefaultValue = new JCheckBox(JMeterUtils.getResString("cssjquery_empty_default_value")); + emptyDefaultValue.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if(emptyDefaultValue.isSelected()) { + defaultField.setText(""); + } + defaultField.setEnabled(!emptyDefaultValue.isSelected()); + } + }); + p.add(emptyDefaultValue, BorderLayout.CENTER); + gbc.gridx++; + gbc.weightx = 1; + gbc.fill = GridBagConstraints.HORIZONTAL; + panel.add(p, gbc.clone()); + return panel; } --- src/core/org/apache/jmeter/resources/messages.properties (revision 1755638) +++ src/core/org/apache/jmeter/resources/messages.properties (working copy) @@ -214,6 +214,7 @@ critical_section_controller_label=Lock name critical_section_controller_title=Critical Section Controller cssjquery_attribute=Attribute\: +cssjquery_empty_default_value=Use empty default value cssjquery_tester_error=An error occured evaluating expression:{0}, error:{1} cssjquery_impl=CSS/JQuery implementation\: cssjquery_render_no_text=Data response result isn't text. --- src/core/org/apache/jmeter/resources/messages_fr.properties (revision 1755638) +++ src/core/org/apache/jmeter/resources/messages_fr.properties (working copy) @@ -207,6 +207,7 @@ critical_section_controller_label=Nom du verrou critical_section_controller_title=Contr\u00F4leur Section critique cssjquery_attribute=Attribut +cssjquery_empty_default_value=Utiliser la cha\u00EEne vide comme valeur par d\u00E9faut cssjquery_impl=Impl\u00E9mentation CSS/JQuery\: cssjquery_render_no_text=Les donn\u00E9es de r\u00E9ponse ne sont pas du texte. cssjquery_tester_button_test=Tester @@ -219,9 +220,9 @@ database_conn_pool_max_usage=Utilisation max pour chaque connexion\: database_conn_pool_props=Pool de connexions \u221A\u2020 la base de donn\u221A\u00A9es database_conn_pool_size=Nombre de Connexions dans le Pool\: -database_conn_pool_title=Valeurs par d\u221A\u00A9faut du Pool de connexions JDBC +database_conn_pool_title=Valeurs par d\u00E9faut du Pool de connexions JDBC database_driver_class=Classe du Driver\: -database_login_title=Valeurs par d\u221A\u00A9faut de la base de donn\u221A\u00A9es JDBC +database_login_title=Valeurs par d\u00E9faut de la base de donn\u221A\u00A9es JDBC database_sql_query_string=Requ\u00EAte SQL \: database_sql_query_title=Requ\u00EAte SQL JDBC par d\u00E9faut database_testing_title=Requ\u221A\u2122te JDBC --- xdocs/usermanual/component_reference.xml (revision 1755674) +++ xdocs/usermanual/component_reference.xml (working copy) @@ -5656,6 +5656,11 @@ In this case, remove the default value once debugging is complete.

+ + If the checkbox is checked and Default Value is empty, then JMeter will set the variable to empty string instead of not setting it. + Thus when you will for example use ${var} (if Reference Name is var) in your Test Plan, if the extracted value is not found then + ${var} will be equal to empty string instead of containing ${var} which may be useful if extracted value is optional. +

If the match number is set to a non-negative number, and a match occurs, the variables are set as follows: @@ -5765,6 +5770,11 @@ In this case, remove the default value once debugging is complete.

+ + If the checkbox is checked and Default Value is empty, then JMeter will set the variable to empty string instead of not setting it. + Thus when you will for example use ${var} (if Reference Name is var) in your Test Plan, if the extracted value is not found then + ${var} will be equal to empty string instead of containing ${var} which may be useful if extracted value is optional. +

If the match number is set to a non-negative number, and a match occurs, the variables are set as follows: