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
|
<?php
/*
** Zabbix
** Copyright (C) 2001-2018 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
/**
* XPath helper.
*/
class CXPathHelper {
/**
* Escape quotes in XPath param.
*
* @param string $text
*
* @return string
*
* @throws Exception
*/
public static function escapeQuotes($text) {
if (strpos($text, '"') !== false) {
return '\''.$text.'\'';
}
elseif (strpos($text, '\'') === false) {
return '"'.$text.'"';
}
throw new Exception('Cannot escape XPath param containing both quote and apostrophe characters.');
}
/**
* Get XPath selector from specified selector.
*
* @param mixed $type selector type (method) or selector
* @param string $locator locator part of selector
*
* @return string
*
* @throws Exception
*/
public function fromSelector($type, $locator = null) {
$selector = CElementQuery::getSelector($type, $locator);
switch ($selector->getMechanism()) {
case 'class name':
return '*[@class='.static::escapeQuotes($selector->getValue()).']';
case 'id':
return '*[@id='.static::escapeQuotes($selector->getValue()).']';
case 'name':
return '*[@name='.static::escapeQuotes($selector->getValue()).']';
case 'link text':
return 'a[string()='.static::escapeQuotes($selector->getValue()).']';
case 'partial link text':
return 'a[contains(string(), '.static::escapeQuotes($selector->getValue()).')]';
case 'tag name':
return $selector->getValue();
case 'xpath':
return ltrim($selector->getValue(), './');
}
throw new Exception('Not supported selector type "'.$type.'".');
}
}
|