Selenium Select - Selecting 部分文本的下拉选项
Selenium Select - Selecting dropdown option by part of the text
class Selenium Select 有 3 个不同选项的方法 selection:
- select按索引
- select按值
- selectByVisibleText
现在,我有一种情况,我想 select 一些 部分 出现在其中一个选项可见文本中的文本选项(不想让自己接触到整个文本的变化)。
例如:
<option value="0" label="not-intresting">VERY-LONG-TEXT-THAT-I-NEED-TO-SELECT-DOLLAR</option>
而且我只想通过提供 "DOLLAR" 来 select 这个选项,比如:
select.selectByPartOfVisibleText("DOLLAR")
您将如何有效地实施它?
您可以尝试这样的逻辑希望这对您有所帮助
List <WebElements> optionsInnerText= driver.findElements(By.tagName("option"));
for(WebElement text: optionsInnerText){
String textContent = text.getAttribute("textContent");
if(textContent.toLowerCase.contains(expectedText.toLowerCase))
select.selectByPartOfVisibleText(expectedText);
}
}
获取所有 option
值的列表,然后检查该值是否包含您的部分文本。像这样:
List<WebElement> list = driver.findElements(By.tagName("option"));
Iterator<WebElement> i = list.iterator();
while(i.hasNext()) {
WebElement wel = i.next();
if(wel.getText().contains("your partial text"))
{
//select this option
}
}
最终我在这里合并了答案,这就是结果:
Select select = new Select(driver.findElement(By.xpath("//whatever")));
public void selectByPartOfVisibleText(String value) {
List<WebElement> optionElements = driver.findElement(By.cssSelector("SELECT-SELECTOR")).findElements(By.tagName("option"));
for (WebElement optionElement: optionElements) {
if (optionElement.getText().contains(value)) {
String optionIndex = optionElement.getAttribute("index");
select.selectByIndex(Integer.parseInt(optionIndex));
break;
}
}
Thread.sleep(300);
}
在 Scala 中(最终在 Scala 中需要它)看起来像:
def selectByPartOfVisibleText(value: String) = {
val optionElements: util.List[WebElement] = selectElement.findElements(By.tagName("option"))
breakable {
optionElements.foreach { elm =>
if (elm.getText.contains(value)) {
val optionIndex = elm.getAttribute("index")
selectByIndex(optionIndex.toInt)
break
}
}
}
Thread.sleep(300)
}
这是我用来解决 python 中的问题的方法。
我使用了这个选项,所以它选择使用单词 DOLLAR
的文本而不是键入整个单词作为值。
Select(driver.find_element_by_name(ELEMENT)).select_by_value("DOLLAR")
而不是
Select(driver.find_element_by_name(ELEMENT)).select_by_visible_text(text)
我的解决方案是使用 xpath 查找 select 的子选项。可以使用任何 xpath 方法来查找 select;在这个例子中,我通过 id.
找到 select
List<WebElement> options = driver.findElements(By.xpath("//select[@id = 'selectId')]/option"));
for (WebElement option : options) {
if (option.getText().contains("DOLLAR")) {
option.click();
break;
}
}
经过深思熟虑,我意识到这个选项完全可以用 xpath 找到:
driver.findElements(By.xpath("//select[@id = 'selectId')]/option[contains(text(), 'DOLLAR')]")).click();
使用 Java 8 Stream/Lambda:
protected void selectOptionByPartText(WebElement elementAttr, String partialText) {
Select select = new Select(elementAttr);
select.getOptions().parallelStream().filter(option -> option.getAttribute("textContent").toLowerCase().contains(partialText.toLowerCase()))
.findFirst().ifPresent(option -> select.selectByVisibleText(option.getAttribute("textContent")));
}
在最新的 Selenium 版本 3.x 或 4.x 中,Select class 可用于 select 下拉列表中的选项。
例如:有一个口味下拉列表,它需要 select 一个包含名称为 Vanilla
的口味。
WebElement flavour = driver.findElement(By.id("attribute178"));
Select select = new Select(flavour);
String expectedFlavourName = "Vanilla";
List<WebElement> allFlavourList = select.getOptions();
for (WebElement option : allFlavourList) {
String currentFlavourName = option.getText();
if (currentFlavourName.contains(expectedFlavourName)) {
select.selectByVisibleText(currentFlavourName);
break;
}
}
这会起作用
WebElement element = driver.findEle(By.xpath(loc));
Select select = new Select(element);
for(int i=1;i<=select.getOptions().size();i++)
{
if(select.getOptions().get(i-1).getText().contains(containsTxt))
{
select.selectByIndex(i-1);
break;
}
if(i==select.getOptions().size())
{
//"Fail"
}
}
class Selenium Select 有 3 个不同选项的方法 selection:
- select按索引
- select按值
- selectByVisibleText
现在,我有一种情况,我想 select 一些 部分 出现在其中一个选项可见文本中的文本选项(不想让自己接触到整个文本的变化)。
例如:
<option value="0" label="not-intresting">VERY-LONG-TEXT-THAT-I-NEED-TO-SELECT-DOLLAR</option>
而且我只想通过提供 "DOLLAR" 来 select 这个选项,比如:
select.selectByPartOfVisibleText("DOLLAR")
您将如何有效地实施它?
您可以尝试这样的逻辑希望这对您有所帮助
List <WebElements> optionsInnerText= driver.findElements(By.tagName("option"));
for(WebElement text: optionsInnerText){
String textContent = text.getAttribute("textContent");
if(textContent.toLowerCase.contains(expectedText.toLowerCase))
select.selectByPartOfVisibleText(expectedText);
}
}
获取所有 option
值的列表,然后检查该值是否包含您的部分文本。像这样:
List<WebElement> list = driver.findElements(By.tagName("option"));
Iterator<WebElement> i = list.iterator();
while(i.hasNext()) {
WebElement wel = i.next();
if(wel.getText().contains("your partial text"))
{
//select this option
}
}
最终我在这里合并了答案,这就是结果:
Select select = new Select(driver.findElement(By.xpath("//whatever")));
public void selectByPartOfVisibleText(String value) {
List<WebElement> optionElements = driver.findElement(By.cssSelector("SELECT-SELECTOR")).findElements(By.tagName("option"));
for (WebElement optionElement: optionElements) {
if (optionElement.getText().contains(value)) {
String optionIndex = optionElement.getAttribute("index");
select.selectByIndex(Integer.parseInt(optionIndex));
break;
}
}
Thread.sleep(300);
}
在 Scala 中(最终在 Scala 中需要它)看起来像:
def selectByPartOfVisibleText(value: String) = {
val optionElements: util.List[WebElement] = selectElement.findElements(By.tagName("option"))
breakable {
optionElements.foreach { elm =>
if (elm.getText.contains(value)) {
val optionIndex = elm.getAttribute("index")
selectByIndex(optionIndex.toInt)
break
}
}
}
Thread.sleep(300)
}
这是我用来解决 python 中的问题的方法。
我使用了这个选项,所以它选择使用单词 DOLLAR
的文本而不是键入整个单词作为值。
Select(driver.find_element_by_name(ELEMENT)).select_by_value("DOLLAR")
而不是
Select(driver.find_element_by_name(ELEMENT)).select_by_visible_text(text)
我的解决方案是使用 xpath 查找 select 的子选项。可以使用任何 xpath 方法来查找 select;在这个例子中,我通过 id.
找到 selectList<WebElement> options = driver.findElements(By.xpath("//select[@id = 'selectId')]/option"));
for (WebElement option : options) {
if (option.getText().contains("DOLLAR")) {
option.click();
break;
}
}
经过深思熟虑,我意识到这个选项完全可以用 xpath 找到:
driver.findElements(By.xpath("//select[@id = 'selectId')]/option[contains(text(), 'DOLLAR')]")).click();
使用 Java 8 Stream/Lambda:
protected void selectOptionByPartText(WebElement elementAttr, String partialText) {
Select select = new Select(elementAttr);
select.getOptions().parallelStream().filter(option -> option.getAttribute("textContent").toLowerCase().contains(partialText.toLowerCase()))
.findFirst().ifPresent(option -> select.selectByVisibleText(option.getAttribute("textContent")));
}
在最新的 Selenium 版本 3.x 或 4.x 中,Select class 可用于 select 下拉列表中的选项。
例如:有一个口味下拉列表,它需要 select 一个包含名称为 Vanilla
的口味。
WebElement flavour = driver.findElement(By.id("attribute178"));
Select select = new Select(flavour);
String expectedFlavourName = "Vanilla";
List<WebElement> allFlavourList = select.getOptions();
for (WebElement option : allFlavourList) {
String currentFlavourName = option.getText();
if (currentFlavourName.contains(expectedFlavourName)) {
select.selectByVisibleText(currentFlavourName);
break;
}
}
这会起作用
WebElement element = driver.findEle(By.xpath(loc));
Select select = new Select(element);
for(int i=1;i<=select.getOptions().size();i++)
{
if(select.getOptions().get(i-1).getText().contains(containsTxt))
{
select.selectByIndex(i-1);
break;
}
if(i==select.getOptions().size())
{
//"Fail"
}
}