Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium WebDriver单击FF和IE中的相同元素_Selenium - Fatal编程技术网

Selenium WebDriver单击FF和IE中的相同元素

Selenium WebDriver单击FF和IE中的相同元素,selenium,Selenium,下面的代码在IE中运行良好,在FF中它给出ElementNotVisibleException 虽然以下内容在FF中有效,但在IE中却没有任何作用: WebElement element1 = driver.findElement(By.xpath("//div[4]/table/tbody/tr[1]/td[2]")); ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element1); 我正在使用I

下面的代码在IE中运行良好,在FF中它给出ElementNotVisibleException

虽然以下内容在FF中有效,但在IE中却没有任何作用:

WebElement element1 = driver.findElement(By.xpath("//div[4]/table/tbody/tr[1]/td[2]"));
((JavascriptExecutor) driver).executeScript("arguments[0].click();", element1);
我正在使用IE9.0和32位IEDriverServe.exe以及FF 23.0

代码如下:

<div id="popup_12" class="dijitPopup dijitMenuPopup" style="z-index: 1000; right: auto; left: 45px; top: 27px; visibility: visible; display: none;" role="presentation" dijitpopupparent="dijit_MenuBar_0">
 <table class="dijit dijitMenu dijitReset dijitMenuTable dijitMenuPassive" cellspacing="0" data-dojo-attach-event="onkeypress:_onKeyPress" tabindex="0" role="menu" widgetid="dijit_Menu_1" style="top: 0px; visibility: visible;">
  <tbody class="dijitReset" data-dojo-attach-point="containerNode">
   <tr class="dijitReset dijitMenuItem" tabindex="-1" role="menuitem" data-dojo-attach-point="focusNode" aria-labelledby="dijit_PopupMenuItem_1_text dijit_PopupMenuItem_1_accel" style="-moz-user-select: none;" widgetid="dijit_PopupMenuItem_1" aria-haspopup="true">
       <td class="dijitReset dijitMenuItemIconCell" role="presentation">
       <td id="dijit_PopupMenuItem_1_text" class="dijitReset dijitMenuItemLabel" data-dojo-attach-point="containerNode" colspan="2">XXXXX</td>






<div id="popup_23" class="dijitPopup dijitMenuPopup" style="z-index: 1001; right: auto; left: 117px; top: 0px; visibility: visible; display: none;" role="presentation" dijitpopupparent="dijit_Menu_1">
  <table class="dijit dijitMenu dijitReset dijitMenuTable dijitMenuPassive" cellspacing="0" data-dojo-attach-event="onkeypress:_onKeyPress" tabindex="0" role="menu" widgetid="dijit_Menu_2" style="top: 0px; visibility: visible;">
    <tbody class="dijitReset" data-dojo-attach-point="containerNode">
        <tr class="dijitReset dijitMenuItem" tabindex="-1" role="menuitem" data-dojo-attach-point="focusNode" aria-labelledby="dijit_MenuItem_3_text dijit_MenuItem_3_accel" style="-moz-user-select: none;" widgetid="dijit_MenuItem_3">
        <tr class="dijitReset dijitMenuItem" tabindex="-1" role="menuitem" data-dojo-attach-point="focusNode" aria-labelledby="dijit_MenuItem_4_text dijit_MenuItem_4_accel" style="-moz-user-select: none;" widgetid="dijit_MenuItem_4">
        <tr class="dijitMenuSeparator" style="-moz-user-select: none;" widgetid="dijit_MenuSeparator_0">
        <tr class="dijitReset dijitMenuItem" tabindex="-1" role="menuitem" data-dojo-attach-point="focusNode" aria-labelledby="dijit_MenuItem_5_text dijit_MenuItem_5_accel" style="-moz-user-select: none;" widgetid="dijit_MenuItem_5">
                <td class="dijitReset dijitMenuItemIconCell" role="presentation">
                <td id="dijit_MenuItem_5_text" class="dijitReset dijitMenuItemLabel" data-dojo-attach-point="containerNode" colspan="2">YYYYY</td>
我必须单击项目XXXXX和项目YYYY

每次加载页面或单击项目时,带有popup_12和popup_23的div id都会更改

仅当单击项目XXXXX时,才会显示项目YYYY

使用javascript执行器和xpath或CSS选择器的FF可以完美地工作,但使用IE则不行


对于IE来说,我必须使用xpath或CSS,而不使用javascript executor,但这一次它对FF不起作用,您总是可以看到元素是否显示为可见的,而不仅仅是在DOM中

el = driver.find_element(:xpath, 'xpath').displayed?
el.click

我们已经测试了数千个网站,在这样做的时候,我有时会在Selenium/WebDriver中遇到类似的限制。XPath非常强大,我们每天都使用它,但是假设页面使用JQuery,您可以使用JQuery选择器对DOM进行整个搜索,这样您就不必担心元素是否可见

代码可能类似于: executeScript$'td:contains\Foo\'。单击

我不推荐你这样在DOM中行走,找到你想要的东西会更有效率。但是,根据以上内容,您可以执行以下操作: driver.executeScript$$$$body.find'div'[4]。find'table:first。find'tbody:first。find'tr'[1]。find'td'[2]。单击

您可以在jQuery选择器的网站上阅读更多关于jQuery选择器的信息

使用Neustar本地验证器编写功能测试脚本很容易。您可以在以下位置查看示例并观看有关如何执行此操作的视频:

祝你好运。 布莱恩·克伦森 纽斯达公司/专业服务工程师

int no_of_popups = driver.findElements(By.cssSelector("div[id*='popup']")).size();

for(int i=1;i<=no_of_popups;i++)

{

String text = driver.findElement(By.cssSelector("div.dijitPopup:nth-of-type("+i+
") > table.dijitReset > tbody.dijitReset > tr.dijitMenuItem > td.dijitMenuItemLabel")).getText();

  S.O.P(text);

}

您可以使用WaitTime或wait for元素,如下所示

int timeout=1;
while(timeout<=60)
{
    WebElement element1 = driver.findElement(By.xpath("//div[4]/table/tbody/tr[1]/td[2]"));

    if(element1.isDisplayed())
    {
        ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element1);
        break;
    }
    else
    {
        try {
            Thread.sleep(2000);
            timeout++;
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

我在硒方面没有经验,但我觉得奇怪的是,你在推销你的产品,因为我不能说它对这个问题是否有用。要知道之前已经讨论过了:。马克,谢谢你强调代码,我本来应该这么做的。还感谢您添加jQuery的链接。我理解您在推广链接上的观点,但是本地验证器使使用Selenium进行功能测试变得更加容易。但愿几年前我开始做这件事的时候就知道了。而且是免费的。我非常理解你的观点,所以我删除了我们网页的链接,并严格保留了关于如何使用本地验证器的链接,我认为这对海报很有用。编辑没有问题,这是正常的事情。通过你的编辑,我认为你的答案没有问题,如果它能帮助op,那正是我们想要的。这是如何处理可见元素的?这还假设页面上有jQuery,因此如果jQuery不加载,测试将中断。我还可以看到,这可以很容易地使用CSS选择器来完成。因此,我看不出这有什么好处?这会考虑可见的元素,因为javascript/jQuery不关心单击该元素是否可见。本例中使用jQuery是因为它很容易在DOM中定位元素。这不是一个要求,您可以对javascript执行同样的操作。只是需要更多的代码。如果元素是隐藏的,则不能使用CSS选择器执行此操作。也许td后面有一个可见的span,但是示例代码不在这里供我们查看。
int timeout=1;
while(timeout<=60)
{
    WebElement element1 = driver.findElement(By.xpath("//div[4]/table/tbody/tr[1]/td[2]"));

    if(element1.isDisplayed())
    {
        ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element1);
        break;
    }
    else
    {
        try {
            Thread.sleep(2000);
            timeout++;
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}