我可以通过仅具有部分名称的By.name搜索元素吗?

时间:2018-07-04 16:04:13

标签: java selenium xpath css-selectors webdriver

我一直在使用

WebElement strecord = driver.findElement(By.name("Ui_u123));

只能使用“ By.name”来找到值

字段现在是动态的,但前3个字符始终为“ Ui_u

我现在如何找到它,“ By.name”包含...。?

3 个答案:

答案 0 :(得分:0)

您可以尝试以下xpath:

    public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private final String TAG = "mk";

    @Override
    public void onTokenRefresh() {

        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        Log.e(TAG, "MyFirebaseInstanceIDService Token: " + refreshedToken);
    }
}

尽管这是 xpath 。我不确定 public class ActivityOne extends AppCompatActivity { private final String TAG = "mk"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_one); String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Intent intent = getIntent(); if (intent != null && intent.getExtras() != null) { Bundle extras = intent.getExtras(); for (String key : extras.keySet()) { Log.e(TAG, key + " : " + extras.get(key)); } } Log.e(TAG, "Token: " + refreshedToken); //sendNotificationToPatner(); } private void sendNotificationToPatner() { Log.e(TAG, "in sendNotificationToPatner: "); SendNotificationModel sendNotificationModel = new SendNotificationModel("check", "i miss you"); RequestNotificaton requestNotificaton = new RequestNotificaton(); requestNotificaton.setSendNotificationModel(sendNotificationModel); requestNotificaton.setToken("cJ-y3b3mnYk:APA91bEYTp1LtfpMHp-wdvKkq1_dVYF4DXl1SHWIaw0guwPSoTyFtbcJjPPB6GhP0FuRd9ybJ--BM6W3aFB-2-3KpVOBDITX91QV4kH1lAgxsIxHcfaj5FQLOIZ0t_HDC2bd8hqJrH-F4x_wuunJfYzanAagm4xcaA"); ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); retrofit2.Call<ResponseBody> responseBodyCall = apiService.sendChatNotification(requestNotificaton); responseBodyCall.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) { Log.d(TAG, "in onResponse"); } @Override public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) { Log.d(TAG, "in onFailure"); } }); } } 具有 Name 属性。

它可能与多个元素匹配。在这种情况下,您将必须使用//*[starts-with(@name,'Ui_u')]

代码

starts-with

作为@HellPine答案的补充。您可以将CSS选择器编写为:

findElements()

答案 1 :(得分:0)

为什么不尝试CSS方法[name*='Ui_u']

请注意*=表示包含,您可以对元素上的任何标记使用[]

此致

答案 2 :(得分:0)

直接回答,,您不能将contains By.name 结合使用。

说明

根据Locator Strategies,当您使用driver.findElement(By.name("Ui_u123));内部的 Java客户端实现时:

case "name":
  toReturn.put("using", "css selector");
  toReturn.put("value", "*[name='" + value + "']");
  break;

转换定位器策略:

driver.findElement(By.name("Ui_u123));

收件人:

driver.findElement(By.cssSelector("[name='Ui_u123']));

您可以在Official locator strategies for the webdriver

中找到详细的讨论

现在,如果您强行尝试使用关键字contains,它将按如下所示提高InvalidSelectorException

org.openqa.selenium.InvalidSelectorException: invalid selector: Unable to locate an element with the xpath expression

如果您想实现类似于contains的方法,则可以使用以下任一解决方案:

  • ^ :表示属性值

    开头
    WebElement strecord = driver.findElement(By.cssSelector("[name^='Ui_u']));
    
  • $ :表示属性值结尾(不适用于您的情况,因为该属性以Ui_u开头)

    WebElement strecord = driver.findElement(By.cssSelector("[name$='123']));
    
  • * :表示包含

    的属性值
    WebElement strecord = driver.findElement(By.cssSelector("[name*='Ui_u']));
    

您可以在How to get selectors with dynamic part inside using Selenium with Python?

中找到详细的讨论