如何通过selenium更改预订中的货币

问题描述 投票:0回答:1

我正在尝试通过 Selenium 在 booking.com 网站上兑换美元货币 但我在“点击”美元符号时遇到了一些问题。我的代码始终设置列表中的第一个货币,即欧元。我在 find_elemnt CSS 选择器中看到了问题。

Now I have CSS like below:

        currency_element.click()
        selected_currency = self.find_element(
            By.CSS_SELECTOR,'button[data-testid="selection-item"][class="a83ed08757 aee4999c52 ffc914f84a c39dd9701b ac7953442b"]'
        )
        selected_currency.click()

我尝试使用 Xpath,但结果我收到了印度卢比。

非常感谢您的帮助

selenium-webdriver web-scraping css-selectors
1个回答
0
投票

对于我的示例,我将使用 XPath 而不是 CSS 选择器。

假设您已经单击按钮选择货币,页面上将会出现一个弹出窗口。此弹出窗口似乎不在 iframe 内。如果是这种情况,您将需要调用 Selenium 函数来查找 iframe 并切换到它,以便找到需要与之交互的框架内的组件,一旦 iframe 被关闭,您将不得不切换返回到父框架。这里的情况并非如此。弹出窗口只是一个简单的组件,在单击货币按钮之前只是隐藏。

每个货币按钮的路径都相当复杂。在较高级别上,此弹出窗口分为两个部分:为您建议的货币(绿色框)和所有货币部分(红色框)。对于此示例,假设我们只需要与“所有货币”部分进行交互。由于我们期望(到目前为止),到此部分的路径对于我们的所有测试都保持不变,因此我将构造一个不包含任何变量的 XPath。换句话说,XPath 字符串将不包含在测试期间要替换为值的通配符。此部分的 XPath 很简单:

//div[@data-testid='All currencies']

现在我们已经移动到页面的正确部分,我们需要识别要单击的项目。货币数组是使用一系列代表一行的无序列表(ul 标签名称)在页面上构建的。这些行中的每一行(第一行以蓝色框出)包含许多列表项(li标签名称),每个列表项最终将具有描述货币的可识别文本(即“美元”)。因为我们不知道所需货币所在的确切行,所以我们将使用相对路径 (//) 将行元素 (ul) 附加到 XPath。因此,我的新 XPath 字符串现在是

//div[@data-testid='All currencies']//ul

由于所有列表项都是行元素的直接子元素,因此我们将使用单斜杠将其附加到 XPath:

//div[@data-testid='All currencies']//ul/li

XPath 的剩余部分用于匹配货币文本。我们不应该为此使用数组表示法。相反,我们应该做的是识别包含文本的组件。假设我们要将货币更改为“阿根廷比索”。一个硬编码的解决方案如下所示:

//div[@data-testid='All currencies']//ul/li//span[text()='Argentine Peso']
。我使用包含文本的 span 元素的相对路径的原因只是为了缩短该组件的路径。 lispan 之间的组件列表确实无关紧要。

我们的硬编码解决方案如下所示

//div[@data-testid='All currencies']//ul/li//span[text()='Argentine Peso']

在上面的XPath中,改变的部分只是货币名称(或文本)。您可以使用通配符,以便在测试时将通配符替换为货币的确切文本。例如,如果我需要选择“以色列新谢克尔”而不是阿根廷比索,我可以替换硬编码解决方案中的文本,它应该可以工作:

//div[@data-testid='All currencies']//ul/li//span[text()='Israeli New Shekel']

效果如下图所示

现在,为了最终确定我的解决方案,我将用一些不在 XPath 字符串其余部分中的字符(或字符序列)替换硬编码的货币描述,这样当我调用“替换子字符串”函数时,我可以简单地说“用此货币描述替换通配符”,其余的应该可以工作。例如:

//div[@data-testid='All currencies']//ul/li//span[text()='%']

在 Java 函数中,您可以执行以下操作,将通配符替换为货币描述:

String currency = "Argentine Peso";
String xpath = "//div[@data-testid='All currencies']//ul/li//span[text()='%']";
xpath.replace("%", currency);

上述步骤序列将用

currency
变量的值(“阿根廷比索”)替换通配符子字符串 (%)。在 Selenium 测试的上下文中,您应该能够适应此解决方案。如果您使用的是 Cucumber 之类的东西,您可以轻松地对其进行调整以获取测试用例中的货币并替换 XPath 字符串中的通配符。

如果您不是在测试环境中使用 Selenium,而是在某些自动化计划中使用 Selenium,则可以执行相同的操作。您可以将类似的逻辑嵌入到您的(例如 JavaScript 函数)中,并在运行时进行此替换。关键是将通配符 XPath 字符串存储在某个属性中,然后将其变形为您需要此特定函数执行的任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.